了解堆栈上变量的空间分配

时间:2016-03-16 04:27:15

标签: c visual-studio assembly stack

我想了解如何对堆栈上的变量进行空间分配。

此处为此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个字节?

有人可以澄清这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

编译器可以根据需要自由分配额外的存储空间。 C标准没有规定堆栈分配的约束。

编辑:

我使用ICC编译器对godbolt进行了一些实验,ICC编译器是唯一一个生成代码的编译器。我对自己之前提到过的主要论点的论点不以为然。我也尝试创建一些字符数组,发现堆栈总是以16字节为增量进行分配。 1-16字节的字符数组都会导致16字节的分配。接下来的17-32将导致32字节的分配,依此类推。

相关问题