Где хранятся статические переменные (сегмент данных, куча или BSS)? - PullRequest
2 голосов
/ 25 марта 2010

Я получил противоречивые мнения о хранении статических переменных.

Мнение 1: "A стек статическая переменная сохраняет свое значение в куче "

Мнение 2: "A стек статическая переменная сохраняет свое значение в data сегмент".

Меня смущают эти противоречивые ответы.

Где именно хранятся статические переменные?

Я ожидаю ответов со ссылками (учебники, аутентичные учебные пособия и т. Д.).

Статические переменные имеют два типа:

  1. статические переменные, объявленные внутри функции.
  2. глобальная (объявленная вне функции) статическая переменная.

Я также хотел бы знать, есть ли разница в хранении этих двух типов переменных?

Ответы [ 3 ]

10 голосов
/ 25 марта 2010

«Переменные стека» обычно хранятся в «стеке», который отделен от текстовых разделов, разделов «bss» и «куча» вашей программы.

Вторая половина вашего вопроса касается «статических» переменных, которые отличаются от стековых переменных - действительно, статические переменные вообще не живут в стеке. Классически, все статические переменные будут находиться в разделах data или bss вашей программы. В современных компиляторах, если данные являются константно-квалифицированными, эти данные могут храниться в текстовом разделе вашей программы, что имеет ряд преимуществ (включая принудительную неизменяемость).

Стандарт C не предписывает наличие стека или раздела bss. Для этого требуется только место для хранения переменных с соответствующей продолжительностью.

0 голосов
/ 27 марта 2015

И локальные, и глобальные статические переменные хранятся в инициализированных сегментах данных.

Существует два сегмента данных: инициализированный сегмент данных и унифицированный сегмент данных.

Сегментированный сегмент данных, также называемый BSS.

Когда мы говорим сегмент данных, по умолчанию это инициализированный сегмент данных, этот раздел копируется из загруженного образа программы. (все глобальные переменные и локальные статические переменные инициализированы в ненулевое значение, т.е. ini var1_global = 10;)

Сегемнет неинициализированных данных aka BSS. Этот раздел будет инициализирован нулевым генератором, непосредственно перед вызовом main (). Все унифицированные глобальные, локальные статические данные идут сюда.

http://www.geeksforgeeks.org/memory-layout-of-c-program/

0 голосов
/ 25 марта 2010

Стековая память выделяется при запуске приложения и всегда остается одинаковой по размеру во время выполнения приложения. Он не хранится в сегменте DATA, сегмент DATA предназначен для таких вещей, как постоянные значения, используемые в приложении (например, строковые литералы).

...