我想了解如何对堆栈上的变量进行空间分配。
对于这个没有变量的C程序
main() { return 0; }
它的拆卸是
push ebp
mov ebp, esp
sub esp, 0c0h
main() {
int i = 10; }
该程序的反汇编为
push ebp
mov ebp, esp
sub esp, 0cch
我正在初始化一个INT变量,其大小为4个字节。但是在上面的反汇编中,编译器分配了12个字节(0cc-0c0)。
对于以下程序
main() { long long int i = 10LL; }
拆卸是
push ebp
mov ebp, esp
sub esp, 0D0h
在上面的反汇编中,编译器为long long int分配了16个字节(0D0-0C0),其大小为8个字节。
为什么编译器为大小为4字节的INT分配12个字节(额外分配4个字节。应该对齐8个字节或16个字节),为大小为8字节的LONG LONG INT分配16个字节?
有人可以澄清一下吗?
谢谢。
最佳答案
编译器可以自由分配任意数量的额外存储。 C标准没有规定对堆栈分配的限制。
编辑:
我在godbolt上使用ICC编译器进行了一些实验,ICC编译器是唯一生成类似于您的示例的代码的编译器。我对自己之前提到的主要论点的论点感到反感。我还尝试创建一些字符数组,发现堆栈将始终以16个字节为增量进行分配。 1-16字节的char数组都导致16字节的分配。接下来的17-32将导致32字节的分配,依此类推。