为什么具有多个嵌套循环的代码可以在GCC上立即完成,但是要永远使用VS?

Den*_*lin 5 c++ optimization gcc compiler-optimization visual-studio

long long r = 0;
long long k = 0;
for (; k < 9999999999999; k++) 
{
    for (long long i = 0; i < 9999999999999; i++) 
    {
        for (long long j = 0; j < 9999999999999; j++) 
        {
            r = (r + (i * j) % 100) % 47;
            if (r != 0) 
            {
                r++;
            }
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

此代码在i3Core上以0.000001壁秒执行,在i7Core boost::timer::auto_cpu_timer上检查.

但是对于visual studio 2010来说,它似乎在无限的时间里运行.

GCC或VS出了什么问题?GCC优化太多了吗?

Mys*_*ial 15

是的,GCC正在优化该代码.

具体来说,它知道您没有使用结果,所以它正在删除所有结果.
(你永远不会使用变量r.)

这称为死代码消除.

为了防止编译器对其进行优化,您需要以某种方式使用结果.尝试r在最后打印出来:

cout << r << endl;
Run Code Online (Sandbox Code Playgroud)

但是,我警告您需要减少迭代次数,否则它可能无法在您的生命周期内完成.


我刚刚在VS2010 x64中对此进行了测试.看一下装配,显然VS2010无法优化整个循环.

它表明不同的编译器在优化不同事物的能力方面各不相同.


相关,更深入:GCC如何优化循环中递增的未使用变量?

  • Visual Studio无法完全优化它实际上有点可怕...我将测试VS11 Beta并报告回来. (3认同)
  • 这有点令人沮丧.即使在移除外部两个循环后,VS11 beta也无法优化代码. (2认同)
  • @Xeo除非您正在编写这样的微基准测试,否则在实际代码中,在这样的构造中使用这么多死代码是非常罕见的.所以我可能会认为MS没有发现它是否值得实现所需的依赖性分析来证明这个循环是无用的. (2认同)