变量声明是否意味着内存分配?

Evg*_*eny 14 c

是否可以准确地说出来

void f() {
    int x;
    ...
}
Run Code Online (Sandbox Code Playgroud)

" int x;"表示sizeof(int)在堆栈上分配字节?

那有什么规格吗?

Dav*_*nan 21

标准中没有任何内容要求存在堆栈.标准中没有任何内容要求局部变量需要为其分配内存.变量可以放在寄存器中,甚至可以作为优化完全删除.


Bas*_*tch 7

没有关于此的说明,您的假设通常(但不总是)是错误的.考虑一些代码

void f() {
   int x;
   for (x=0; x<1000; x++) 
     { // do something with x 
     }
   // x is no more used here
}
Run Code Online (Sandbox Code Playgroud)

首先,优化编译器会放入x机器的某个寄存器中,而不会占用任何堆栈位置(除非您使用地址执行某些操作,&x例如将其存储在全局中).

此外,编译器可以展开该循环,并x从生成的代码中删除.例如,许多编译器将替换

for (x=0; x<5; x++) g(x);
Run Code Online (Sandbox Code Playgroud)

相当于

g(0); g(1); g(2); g(3); g(4);
Run Code Online (Sandbox Code Playgroud)

也许取而代之

for (x=0; x<10000; x++) t[x]=x;
Run Code Online (Sandbox Code Playgroud)

喜欢的东西

for (? = 0;  ? < 10000;  ? += 4) 
  { t[?] =  ?; t[?+1] =  ?+1; t[?+2] =  ?+2; t[?+3] =  ?+3; };
Run Code Online (Sandbox Code Playgroud)

其中α是一个新变量(或许x本身).

此外,可能没有堆栈.对于C来说,它并不常见,但是其他一些语言没有任何堆栈(参见例如旧的A.Appel的书中的连续编译).

顺便说一句,如果使用GCC,您可以使用例如MELT探针(或使用gcc -fdump-tree-all它生成数百个转储文件!)来检查其中间(Gimple)表示.

  • 不,编译器可能有一个不使用机器堆栈的ABI.编译器也可以针对某些字节码VM(并且该VM的解释器不会使用很多机器堆栈)并且一些*C解释器*不会使用那么多的机器堆栈. (3认同)

No *_*ame 5

来自GNU

3.2.1 C 程序中的内存分配

当您声明一个自动变量(例如函数参数或局部变量)时,就会发生自动分配。自动变量的空间在包含声明的复合语句进入时分配,并在复合语句退出时释放。在 GNU C 中,自动存储的大小可以是一个变化的表达式。在其他 C 实现中,它必须是一个常量。