Подтвердить что ты не робот

Определяет ли объявление переменной выделение памяти?

Будет ли точный сказать, что в

void f() {
    int x;
    ...
}

"int x;" означает выделение sizeof(int) байтов в стеке?

Существуют ли какие-либо спецификации для этого?

4b9b3361

Ответ 1

Ничто в стандарте не указывает на наличие стека. И ничто в стандарте не требует, чтобы локальная переменная нуждалась в памяти, выделенной для него. Переменная может быть помещена в регистр или даже вообще удалена как оптимизация.

Ответ 2

В этом нет никаких указаний, и ваше предположение часто (но не всегда) ложно. Рассмотрим некоторый код, например

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, который производит сотни файлов дампов!).

Ответ 3

из GNU:

3.2.1 Распределение памяти в программах на C

Автоматическое распределение происходит, когда вы объявляете автоматическую переменную, такой как аргумент функции или локальная переменная. Пространство для автоматическая переменная выделяется, когда составной оператор, содержащий объявление вводится и освобождается, когда это составное утверждение выйдет. В GNU C размер автоматического хранилища может быть выражение, которое меняется. В других реализациях C это должно быть константа.

Ответ 4

Это зависит от большого количества факторов. Компилятор может оптимизировать и удалять его из стека, сохраняя значение в регистре. и т.д.

Если вы компилируете в debug, он, безусловно, выделяет некоторое пространство в стеке, но вы никогда не знаете. Это не указано. Единственное, что нужно указать, это видимость переменной, а также размер и арифметика. Подробнее см. C99 spec.