Статические глобальные переменные выделяют ресурсы памяти либо во время компиляции, либо во время выполнения. Это зависит от того, являются ли статические переменные нулевыми или инициализированы исходными значениями.Например, код, как
//global variable with internal linkage
static int array[100];
не будет занимать любую комнату в исполняемом ... Другими словами, компилятор/компоновщик не будет выделять память в исполняемый файл для этого массива, поскольку он не содержит ничего. Он оставит заглушку, хотя это указывает, когда запускается исполняемый файл, память должна быть выделена для массива. После запуска исполняемого файла ОС видит заглушку, оставленную компоновщиком, и выделяет и нуль инициализирует память для массива (а также другую память для кучи и т. Д.). С другой стороны,
//global variable with internal linkage
static int array[100] = { 1, 2, 3};
займет место в исполняемом файле, поскольку оно инициализируется постоянными значениями во время компиляции. Таким образом, компилятор будет испускать код в разделе data
файла сборки, который он генерирует, который выделяет хранилище для массива. Затем компоновщик правильно компонует разделы раздела данных и кода всех файлов сборки, которые связаны с окончательным исполняемым файлом. Когда ОС загружает исполняемый файл в память, память для массива уже является частью памяти исполняемого файла «foot-print».
Автоматические переменные, поскольку они выделены в стеке во время выполнения кода, выделяются во время выполнения.
Также говорится, что адрес глобальной переменной является постоянной времени компиляции.
Это немного вводит в заблуждение ... в C вы не можете знать точный адрес памяти любых глобальных переменных, пока компоновщик не создаст исполняемый файл, а ОС загрузит исполняемый файл в память. Единственный способ сделать это можно было бы, если бы вы вручную собрали файл и создали плоский двоичный файл, который был специально загружен в данный адрес операционной системой, но современные операционные системы не позволяют вам это делать. Вместо этого адреса глобальных переменных присваиваются владельцам мест, чтобы их можно было заменить правильными значениями, когда ОС загружает исполняемый файл во время выполнения. Поэтому, когда адрес памяти является «постоянным» в том смысле, что он не будет меняться со временем во время работы программы, его фактическое значение не назначается во время компиляции.
Объявление типа 'int a;' не соответствует непосредственно машинной инструкции. –
Это домашнее задание? – Francois
, который не является частью моей домашней работы. Вопрос: на мой взгляд, старое обучение сталкивается с новым. Также я всегда это делаю Google до тех пор, пока не разойдусь –