在C++中调用函数时push rdi和pop rdi的目的是什么?
VS2010,x64,调试,无优化

C++

int calc()
{
    return 8 + 7;
}

拆卸:
int calc()
{
000000013F0B1020  push        rdi
    return 8 + 7;
000000013F0B1022  mov         eax,0Fh
}
000000013F0B1027  pop         rdi
000000013F0B1028  ret

最佳答案

没有目的。这是未优化代码的常见问题。代码生成器在预期必须执行加法运算时发出push edi指令。 EDI寄存器必须在函数调用之间保留。但是随后,我们发现可以在编译时执行加法操作。

摆脱这样的无关代码需要"peephole optimization"。但是,该优化未在Debug版本中启用。要了解真实代码的外观,您必须打开优化器,最好通过构建Release版本来完成。实际上,它将完全消除该功能,您可以使用以下方法阻止它:

__declspec(noline) int calc()
{
    return 8 + 7;
}

在Release版本中产生的内容:
    return 8 + 7;
000007F7038E1000  mov         eax,0Fh
000007F7038E1005  ret

10-04 14:41