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

对于这个没有变量的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字节的分配,依此类推。

08-05 23:42