C++ 为什么这个源代码分配了16个字节?

C++ 为什么这个源代码分配了16个字节?,c++,gdb,C++,Gdb,g++-g-o demo.cpp 跟进。。。 我读了更多关于堆栈对齐的文章(对不起,我现在正在学习计算机拱门和组织类…所以我对这一点一点都不熟悉) 我想这是编译器的设置。因此,默认情况下,最小值为16字节 如果我们有 // no header. nothing int main() { int a = 1; int b = 10; int c; c = a + b; return 0; } 在int d之前,我

g++-g-o demo.cpp


跟进。。。 我读了更多关于堆栈对齐的文章(对不起,我现在正在学习计算机拱门和组织类…所以我对这一点一点都不熟悉)

我想这是编译器的设置。因此,默认情况下,最小值为16字节

如果我们有

// no header. nothing
int main()
{
        int a = 1;
        int b = 10;
        int c;
        c = a + b;
        return 0;
}
在int d之前,我们正好有16个字节,分配仍然是0x10。但当我们给出另一个delectation时,int e=10,esp现在分配了32个字节(0x20)

这表明esp(堆栈指针)仅用于自动变量


后续行动2

调用堆栈和堆栈框架

每个堆栈帧

但是在我们分配int a到int d之后,它已经占用了我们16个字节。Main没有函数参数,所以是零。但是要返回的线路,这些信息去了哪里

I尽管我还没有看到
main()
的源代码,但我相信这是由于堆栈对齐

在您的设置下,堆栈可能需要对齐到8字节。因此,
esp
将增加16个字节,而不是12个字节。(即使12个字节足以容纳所有变量)


在其他系统(使用SSE或AVX)上,堆栈需要对齐到16或32个字节。

没有任何错误-前四个字节分配给返回代码:)

我们可以查看
main()
的源代码吗?@mystical yes。我刚刚编辑过。谢谢。关于第二次编辑的答案,请检查此链接:()它确切地显示了它的工作方式以及返回地址和其他所有内容的位置。+1:如果main调用了更多函数,则每个函数都希望堆栈对齐。它不是每次调整堆栈一点,12个字节用于变量,然后在函数调用之前再调整4个字节,而是提前16个字节进行调整。谢谢我刚刚写了后续报道。你是对的。我相信这是一个编译器设置。根据您的编辑,堆栈对齐似乎是16字节而不是8字节。:)@赞山猫。嗯,那很有趣。因为在后续的研究中,int a-->int d没有出现“4个字节”的情况。它仍然分配了多达16个字节。我知道在每个函数调用的条目上,我们都有一个堆栈框架来存储参数、返回的地址、自动变量…@Mysticial我刚刚完成了这个任务。非常感谢。我想情况不是这样的。看我的后续。。。我知道返回(返回哪一行)是存储在堆栈框架中的信息之一。不太可能-返回似乎放在eax中。@SteveFallows谢谢。我发布了后续2。我了解每个堆栈帧存储的内容。但是当我们声明int a到d时,已经是16个字节了。
// no header. nothing
int main()
{
        int a = 1;
        int b = 10;
        int c;
        c = a + b;
        return 0;
}
int a = 1;
int b = 10;
int c = 10;
int d = 10;
// --
int e = 10;
Storage space for all the automatic variables for the newly called function.

The line number of the calling function to return to when the called function returns.

The arguments, or parameters, of the called function.