int square() {
char test[50];
}
上面的代码产生
square():
push rbp
mov rbp, rsp
当我将代码稍微更改为]时>
int square() { char test[150]; }
生成的程序集是
square(): push rbp mov rbp, rsp sub rsp, 40
这仍然很奇怪,因为我不明白为什么它不分配给以前的作品。我正在-O0运行,因此gcc不会对其进行优化。为什么gcc为错误大小的数组创建代码?
int square() { char a[50]; char b[50]; }
square(): push rbp mov rbp, rsp sub rsp, 8
类似地对于x86
int square() { char a[500]; }
用-m32编译给我:
square(): push ebp mov ebp, esp sub esp, 512
这额外的12个字节从哪里来?为什么-m32有用于char test [50]的子指令,而x86_64没有?
int square(){char test [50]; }上面的代码产生了square():push rbp mov rbp,rsp当我将代码稍微更改为int square(){char test [150]; } ...
[GCC在变量的堆栈指针下方使用x86-64 System V ABI的128字节Red Zone,仅在不够时才保留一些额外的堆栈空间
对于最后一个示例,使用GCCsub
s 512
使堆栈(和阵列)保持对齐。