Где хранятся локальные, глобальные, статические, авто, регистр, extern, const, volatile переменные? - PullRequest
29 голосов
/ 10 сентября 2010

Где хранятся локальные, глобальные, статические, автоматические, регистровые, внешние, постоянные, переменные переменные?

Ответы [ 5 ]

59 голосов
/ 10 сентября 2010
  • локальные переменные могут храниться либо в стеке, либо в сегменте данных в зависимости от того, являются ли они автоматическими или статическими. (если явно не указано ни auto, ни static, подразумевается auto)

  • глобальные переменные хранятся в сегменте данных (если компилятор не может их оптимизировать, см. Const) и имеют видимость от точки объявления до конца модуля компиляции.

  • статические переменные хранятся в сегменте данных (опять-таки, если компилятор не может их оптимизировать) и имеют видимость от точки объявления до конца охватывающей области. Глобальные переменные, которые не являются статичными, также видны в других единицах компиляции (см. Extern).

  • auto переменные всегда локальны и хранятся в стеке.

  • модификатор register говорит компилятору сделать все возможное, чтобы сохранить переменную в регистре, если это вообще возможно. В противном случае он сохраняется в стеке.

  • extern переменные хранятся в сегменте данных. Модификатор extern сообщает компилятору, что другая единица компиляции фактически объявляет переменную, поэтому не создавайте другой ее экземпляр, иначе произойдет конфликт имен во время ссылки.

  • const переменные могут храниться либо в стеке, либо в сегменте данных только для чтения, в зависимости от того, являются они автоматическими или статическими. Однако, если компилятор может определить, что на них нельзя ссылаться из другого модуля компиляции или что ваш код не использует адрес переменной const, он может оптимизировать его (каждая ссылка может быть заменена постоянным значением) , В этом случае он нигде не сохраняется.

  • модификатор volatile сообщает компилятору, что значение переменной может измениться в любое время от внешних воздействий (обычно аппаратных), поэтому он не должен пытаться оптимизировать любые перезагрузки из памяти в регистр когда на эту переменную ссылаются. Это подразумевает статическое хранение.

Кстати, все это относится и к C & C ++, и к Objective-C.

11 голосов
/ 10 сентября 2010

На каком уровне абстракции вы ищете ответ?

На физическом уровне все они, вероятно, хранятся в ёмкостях затвора и магнитных доменах. (Может быть, даже фотоны, если ваш диск подкачки подключен к Wi-Fi или оптоволоконному кабелю.)

На одном аппаратном уровне копии любой и всех этих переменных могут существовать в нескольких местах в регистре, кеше данных (возможно, на нескольких уровнях), в основной памяти и / или иерархии хранения, все от полностью выгруженного на диск или NV-хранилище (в зависимости от наличия, реализации и текущего состояния любой подсистемы виртуальной памяти с подкачкой по требованию), чтобы, возможно, все в регистрах, если размер и время жизни ваших приложений достаточно малы.

Учитывая наиболее знакомые реализации компилятора и среды выполнения, память (возможно, виртуальная) разделена на вещи, называемые стеками и кучами. Учитывая формальное определение языка, эта рубка может или не может потребоваться.

На уровне оптимизации компилятора многие из этих переменных могли быть оптимизированы из-за отсутствия. Они не хранятся нигде, кроме как абстракция.

5 голосов
/ 10 сентября 2010

Локальные и auto переменные хранятся в стеке. Глобальные и static переменные хранятся на странице данных. register переменные сохраняются в регистре процессора, если это возможно, иначе в стеке. extern, const и volatile не указывают, где хранится переменная; переменная хранится там, где другие спецификаторы хранилища говорят, что они есть.

2 голосов
/ 10 сентября 2010

Локальные переменные обычно хранятся в стеке, а глобальные переменные в «текстовом» сегменте программы (в случае строковых констант) или в куче, если они динамически размещаются. Автоматические переменные обычно используются в функциях / методах и обычно передаются в стеке (иногда в регистрах, в зависимости от архитектуры). Переменные регистров когда-то хранились в регистрах, но в настоящее время большинство компиляторов игнорируют ключевое слово register и помещают их, где они считают нужным - в стек или в регистр. Extern, const и volatile члены являются модификаторами и поэтому не имеют определенного места, где они хранятся.

Таким образом, короткий ответ, как обычно, "это зависит".

1 голос
/ 03 февраля 2012

LOCAL - Локальные переменные, с которыми находится область действия в функции. Это может быть два типа auto или static.Если он объявлен просто int var.Compiler, он считается классом автоматического хранения.Авто переменные хранятся в стеке.Статические переменные хранятся в сегменте данных.

Переменные регистров хранятся в CPU. Если нет регистров для хранения переменных. Затем компилятор обрабатывается как автоматическая переменная.

Глобальные переменные хранятсяв области сегмента данных.

Переменные const хранятся в области только для чтения. Это область фрагмента кода памяти.

...