C++ 释放模式跳过部分代码
当尝试测试函数的速度时,我发现并非我的代码的所有部分都在C++ 释放模式跳过部分代码,c++,compiler-optimization,C++,Compiler Optimization,当尝试测试函数的速度时,我发现并非我的代码的所有部分都在Release模式下工作。但是,相同的代码在Debug模式下可以完美工作 我正在使用VC++编译器进行/O2优化 这是剪下的部分,不起作用 intmain() { boost::timer::auto\u cpu\u timer t; 对于(int i=0;i
Release
模式下工作。但是,相同的代码在Debug
模式下可以完美工作
我正在使用VC++编译器进行/O2
优化
这是剪下的部分,不起作用
intmain()
{
boost::timer::auto\u cpu\u timer t;
对于(int i=0;i<1000000;i++)
gcdb(i,5);
返回0;
}
在发布模式下生成的程序集中,for循环的代码仅在此模式下丢失
int main()
{
000000013F8E1280 sub rsp,88h
000000013F8E1287 mov rax,qword ptr [__security_cookie (013F8E7150h)]
000000013F8E128E xor rax,rsp
000000013F8E1291 mov qword ptr [rsp+70h],rax
boost::timer::auto_cpu_timer t;
000000013F8E1296 lea rcx,[t]
000000013F8E129B mov edx,6
000000013F8E12A0 call boost::timer::auto_cpu_timer::auto_cpu_timer (013F8E2DA0h)
for(int i = 0; i < 1000000; i++)
gcdb(i, 5);
return 0;
000000013F8E12A5 lea rcx,[t]
000000013F8E12AA call boost::timer::auto_cpu_timer::~auto_cpu_timer (013F8E2810h)
000000013F8E12AF xor eax,eax
}
intmain()
{
0000000 13F8E1280子rsp,88h
0000000 13f8e1287 mov-rax,qword-ptr[\uuuuu-security\u-cookie(013F8E7150h)]
0000000 13F8E128E异或rax,rsp
0000000 13F8E1291 mov qword ptr[rsp+70小时],rax
boost::timer::auto\u cpu\u timer t;
0000000 13F8E1296 lea rcx[t]
0000000 13F8E129B移动edx,6
0000000 13F8E12A0调用增强::计时器::自动cpu计时器::自动cpu计时器(013F8E2DA0h)
对于(int i=0;i<1000000;i++)
gcdb(i,5);
返回0;
0000000 13F8E12A5 lea rcx[t]
0000000 13F8E12AA调用增强::计时器::自动cpu计时器::自动cpu计时器(013F8E2810h)
0000000 13F8E12AF异或eax,eax
}
gcdb()
只是一个查找两个数字的GCD的函数
是什么导致了代码跳过?您在这里看到的是编译器优化,称为 当编译器发现不需要某些代码的结果时,可以随意删除它。这是所有现代编译器采用的标准优化 防止编译器对其进行优化的一个解决方法是以某种方式实际使用输出:
int main()
{
boost::timer::auto_cpu_timer t;
int sum = 0;
for(int i = 0; i < 1000000; i++)
sum += gcdb(i, 5);
cout << sum << endl;
return 0;
}
intmain()
{
boost::timer::auto\u cpu\u timer t;
整数和=0;
对于(int i=0;i<1000000;i++)
总和+=gcdb(i,5);
cout如果编译器可以证明没有副作用,并且您不在任何地方使用结果,则可以完全删除该循环
尝试对结果求和,然后从main返回整数和-这样会有一个明显的副作用,应该可以阻止优化器变得太聪明。编译器优化了它,这不是一个好理由吗?我可以阻止它优化该部分吗?尝试在循环外声明一个变量,并分配gcdb()的结果
。@Ynau:编译器检测到gcdb
没有副作用,因此可以在不改变程序功能的情况下删除它;类似地,可以删除for
循环。这就是优化的目的:在不改变功能的情况下提高性能。您也可以在调试模式下运行吗“不进行调试就不能进行调试吗?”JeremyTrifilo你可以,但你得到的数字将毫无意义。在不启用优化的情况下对程序进行基准测试就像给乌塞恩·博尔特(Usain Bolt)的100米冲刺计时,而不告诉他他实际上应该运行。