sha*_*oth 6 c++ compiler-construction optimization compiler-optimization visual-c++
我正在检查Visual C++ 10优化功能,并发现了一个相当奇怪的事情.这里的所有代码都是用/ O2编译的.
在以下代码中:
int _tmain(int argc, _TCHAR* argv[])
{
char buffer[1024] = {};
MessageBoxA( 0, buffer, buffer, 0 );
memset( buffer, 0, sizeof( buffer ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从机器代码中消除了memset()之前的调用return(我检查了反汇编).这是完全合理的 - 如果buffer之后没有读取则无memset()用,如果开发人员真的想要覆盖缓冲区,则可以使用SecureZeroMemory().
但是在以下代码中:
int _tmain(int argc, _TCHAR* argv[])
{
char buffer[1024] = {};
MessageBoxA( 0, buffer, buffer, 0 );
memset( buffer, 0, sizeof( buffer ) );
Sleep( 0 ); //<<<<<<<<<<<<<<<<<<<<<<<<<<< Extra code
return 0;
}
Run Code Online (Sandbox Code Playgroud)
呼吁memset()没有消除.该调用对观察到的行为没有影响,可以像在第一个片段中一样被消除.
这可能是一个编译器缺陷,或者它可能在某种程度上有用 - 我无法决定.
为什么memset()在为第二个片段发出的机器代码中留下电话会有用?