是否可以准确地说出来
void f() {
int x;
...
}
Run Code Online (Sandbox Code Playgroud)
" int x;
"表示sizeof(int)
在堆栈上分配字节?
那有什么规格吗?
没有关于此的说明,您的假设通常(但不总是)是错误的.考虑一些代码
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)表示.
归档时间: |
|
查看次数: |
6297 次 |
最近记录: |