我想了解如何对堆栈上的变量进行空间分配。
此处为此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个字节。
为什么编译器为INT分配12个字节(4个字节额外分配。应该是8个字节或16个字节对齐),其大小为4个字节,16个字节用于LONG LONG INT,其大小为8个字节?
有人可以澄清这一点。
感谢。
答案 0 :(得分:1)
编译器可以根据需要自由分配额外的存储空间。 C标准没有规定堆栈分配的约束。
编辑:
我使用ICC编译器对godbolt进行了一些实验,ICC编译器是唯一一个生成代码的编译器。我对自己之前提到过的主要论点的论点不以为然。我也尝试创建一些字符数组,发现堆栈总是以16字节为增量进行分配。 1-16字节的字符数组都会导致16字节的分配。接下来的17-32将导致32字节的分配,依此类推。