释放模式跳过部分代码
Release mode skipping parts of code
在尝试测试函数的速度时,我发现并非所有代码部分都在Release
模式下工作。不过,相同的代码在Debug
模式下可以完美地工作。
我使用的是带有/O2
优化的VC++编译器。
这是切除的部分,不起作用。
int main()
{
boost::timer::auto_cpu_timer t;
for(int i = 0; i < 1000000; i++)
gcdb(i, 5);
return 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
}
CCD_ 4只是求两个数的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;
}
相关:GCC如何优化循环中递增的未使用变量?
如果编译器能够证明没有副作用,并且您没有在任何地方使用结果,那么可以完全修剪该循环。
尝试对结果求和,然后从main返回整数和——这样会有一个可观察到的副作用,应该会阻止优化器变得过于聪明。
相关文章:
- 我看过Stellarium代码,我不知道它从哪里开始
- 当我在结构中包含多个数组时,我的程序会跳过一堆代码
- 为什么在代码块中执行时会跳过输入用户输入的行?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 如何在我的代码中修复无穷循环?我认为它跳过了第二个CIN,因此它一直在循环
- 我如何使一行代码可以选择,但在已经选择过一次后不重新选择
- 我在让我的代码输出整个链表时遇到问题.它只是输出我修改过的一些文本文件,而不是整个东西
- VS2017 C++调试器跳过代码行
- 每次我将(播放旋律 - )代码上传到Arduino时,我按下按钮时,它会在数组中跳过相同的音符.怎么会
- 为什么我的部分代码被跳过而不让我输入
- 我可以动态地跳过一系列代码,而不会使用断点在Visual Studio中进行重新编译
- 提升单元测试似乎跳过了应执行的代码
- 根据模板参数内容执行或跳过代码
- 使用子字符串构造函数构建字符串 - 调试 - 当自动跳过代码时
- 程序在用户的第一个输入时不执行任何操作(跳过程序中的整个代码)
- C++ 代码跳过代码,教授无法弄清楚
- 代码跳过 getline 语句.我尝试了getline和cin都没有成功
- C++-在第一次运行后跳过代码
- 交叉点代码,用于打印两个数组(过帐列表)的交叉点
- 为什么我的代码跳过了这个循环