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

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

Ответ 1

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

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

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

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

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

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

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

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

Все это относится к C и С++, а также к Objective-C.

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Регистровые переменные хранятся в CPU. Если для хранения переменных не существует регистров. Затем компилятор рассматривает как автоматическую переменную.

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

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