Будет ли точный сказать, что в
void f() {
int x;
...
}
"int x;
" означает выделение sizeof(int)
байтов в стеке?
Существуют ли какие-либо спецификации для этого?
Будет ли точный сказать, что в
void f() {
int x;
...
}
"int x;
" означает выделение sizeof(int)
байтов в стеке?
Существуют ли какие-либо спецификации для этого?
Ничто в стандарте не указывает на наличие стека. И ничто в стандарте не требует, чтобы локальная переменная нуждалась в памяти, выделенной для него. Переменная может быть помещена в регистр или даже вообще удалена как оптимизация.
В этом нет никаких указаний, и ваше предположение часто (но не всегда) ложно. Рассмотрим некоторый код, например
void f() {
int x;
for (x=0; x<1000; x++)
{ // do something with x
}
// x is no more used here
}
Во-первых, оптимизирующий компилятор помещает x
внутри некоторого регистра машины и не потребляет никакого местоположения стека (если, например, вы не делаете что-то с адресом &x
, например, сохраняете его в глобальном).
Также компилятор мог развернуть этот цикл и удалить x
из сгенерированного кода. Например, многие компиляторы заменят
for (x=0; x<5; x++) g(x);
с эквивалентом
g(0); g(1); g(2); g(3); g(4);
и, возможно, замените
for (x=0; x<10000; x++) t[x]=x;
с чем-то вроде
for (α = 0; α < 10000; α += 4)
{ t[α] = α; t[α+1] = α+1; t[α+2] = α+2; t[α+3] = α+3; };
где α - свежая переменная (или, возможно, x
).
Кроме того, не может быть стека. Для C это необычно, но некоторые другие языки не имеют никакого стека (см., Например, сборник старых A.Appel с продолжением).
BTW, если вы используете GCC, вы можете проверить его промежуточные (Gimple) представления, например. MELT probe (или используя gcc -fdump-tree-all
, который производит сотни файлов дампов!).
из GNU:
3.2.1 Распределение памяти в программах на C
Автоматическое распределение происходит, когда вы объявляете автоматическую переменную, такой как аргумент функции или локальная переменная. Пространство для автоматическая переменная выделяется, когда составной оператор, содержащий объявление вводится и освобождается, когда это составное утверждение выйдет. В GNU C размер автоматического хранилища может быть выражение, которое меняется. В других реализациях C это должно быть константа.
Это зависит от большого количества факторов. Компилятор может оптимизировать и удалять его из стека, сохраняя значение в регистре. и т.д.
Если вы компилируете в debug, он, безусловно, выделяет некоторое пространство в стеке, но вы никогда не знаете. Это не указано. Единственное, что нужно указать, это видимость переменной, а также размер и арифметика. Подробнее см. C99 spec.