我使用Visual Studio C++ 2008 SP1,x64 C++编译器编译了以下内容:
我很好奇,为什么编译器会nop在那些calls 之后添加这些指令?
PS1.我会理解第二和第三个nops将是4字节边距上的代码对齐,但是第一个nop会打破这个假设.
PS2.编译的C++代码中没有循环或特殊的优化内容:
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//This makes no sense. I used it to set a debugger breakpoint
::GdiFlush();
srand(::GetTickCount());
}
Run Code Online (Sandbox Code Playgroud)
PS3.附加信息: 首先,谢谢大家的意见.
以下是其他观察结果:
我的第一个猜测是增量链接可能与它有关.但是,项目中的Release构建设置Visual Studio已incremental linking关闭.
这似乎x64只影响构建.构建为x86(或Win32)的相同代码没有那些nops,即使使用的指令非常相似:
x64产生的代码VS 2013有些不同,它仍会nop在某些calls 之后添加s: …