gpt4 book ai didi

c++ - Release模式跳过部分代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:40 24 4
gpt4 key购买 nike

当尝试测试函数的速度时,我发现并非我的代码的所有部分都在 Release 模式下工作。不过,相同的代码在 Debug 模式下可以完美运行。

我正在使用具有 /O2 优化功能的 VC++ 编译器。

这里是删掉的部分,它不起作用。

int main()
{
boost::timer::auto_cpu_timer t;

for(int i = 0; i < 1000000; i++)
gcdb(i, 5);
return 0;
}

release模式下生成的程序集,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
}

gcdb() 只是一个求两个数的 GCD 的函数。

什么可能导致此代码跳过?

最佳答案

您在这里看到的是称为 Dead Code Elimination 的编译器优化。 .

当编译器看到某些代码的结果不需要时,可以随意剔除。这是所有现代编译器采用的标准优化。

防止编译器对其进行优化的变通方法是以某种方式实际使用输出:

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;
}

相关:How does GCC optimize out an unused variable incremented inside a loop?

关于c++ - Release模式跳过部分代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com