Assembly 虚拟演播室中的空间过度分配

Assembly 虚拟演播室中的空间过度分配,assembly,visual-c++,x86-64,stack-frame,Assembly,Visual C++,X86 64,Stack Frame,我正在学习这门关于x86-64体系结构的课程,我们正在为此目的使用virtual studio,无论是调试还是其他方面。因此,我们得到了如下代码段: int func(){ 长i=0xf01dab1ef007ba11; 长j=0x0b57ac1e5; 返回i+j; } int main(){ 返回func(); } 现在,当我使用调试器时,这是汇编指令 我得到了,这是堆栈图 同样的。现在,如果我们在堆栈图中的地址00000000'0014FDD0处看到额外的8字节分配。我在Microsof

我正在学习这门关于x86-64体系结构的课程,我们正在为此目的使用virtual studio,无论是调试还是其他方面。因此,我们得到了如下代码段:

int func(){
长i=0xf01dab1ef007ba11;
长j=0x0b57ac1e5;
返回i+j;
}
int main(){
返回func();
}
现在,当我使用调试器时,这是汇编指令

我得到了,这是堆栈图

同样的。现在,如果我们在堆栈图中的地址
00000000'0014FDD0
处看到额外的8字节分配。我在Microsoft文档中找到了原因,它声明堆栈将始终保持16字节对齐,prolog中除外(例如,在推送返回地址之后)。。。但也有少数例外。

  • 下面是另一段代码
int func(){
长i=0xf01dab1ef007ba11;
长j=0x0b57ac1e5;
长k=0x57abbadabad00;
返回i+j;
}
int main(){
返回func();
}
这也是组装说明

这是堆栈图

为了它。现在我明白了为什么在地址
00000000'0014FED0
处有额外的8字节分配,这是为了保持堆栈16字节对齐


但我不明白的是,为什么在地址'000000000'014FDC8处有额外的分配?有必要吗?

不,没有必要,您可以消除16字节的填充,甚至整个堆栈帧。我怀疑这只是因为优化被禁用。相关:GCC有类似的遗漏优化错误,即使启用了优化: