C++ C++;带/不带”的性能;";

C++ C++;带/不带”的性能;";,c++,C++,大家好 我的问题很简单,但我没有答案。下面你可以看到我的C++代码——它有一点大但很简单——当我用“代码>//STD::CUT”运行代码时,大多数都是一个简单的优化问题:只要你不从循环中产生任何输出,编译器就确定循环基本上是死区代码,根本不执行它们。它需要做一点预计算来确定vector[5].y在循环之后的值,但它完全可以在编译时这样做,所以在运行时,它基本上只是打印出一个固定的数字 当你在循环中产生可见的输出时,编译器不能仅仅消除执行它们,因此代码运行速度会大大降低。亲爱的上帝,为什么?……天

大家好


我的问题很简单,但我没有答案。下面你可以看到我的C++代码——它有一点大但很简单——当我用“代码>//STD::CUT

”运行代码时,大多数都是一个简单的优化问题:只要你不从循环中产生任何输出,编译器就确定循环基本上是死区代码,根本不执行它们。它需要做一点预计算来确定

vector[5].y在循环之后的值,但它完全可以在编译时这样做,所以在运行时,它基本上只是打印出一个固定的数字


当你在循环中产生可见的输出时,编译器不能仅仅消除执行它们,因此代码运行速度会大大降低。

亲爱的上帝,为什么?……天哪,你怎么会有耐心编写这些嵌套循环呢???!这是因为您的循环只做
cout
,编译器可以在没有它的情况下完全删除它。另外,我强烈建议不要使用这种代码生成,你很可能是在攻击一个XY问题。@SergiuVelescu 68719476736额外的循环迭代才是区别所在。@LưuVĩnhPhúc:仔细看,这是一种误导。好吧-我考虑过这个问题-向量[5]呢。y=aal-1在循环中-这不是强制编译器运行这些循环并计算值吗?(最后,我还得出了这个值)看起来循环正在运行,因为当我注释一个循环时,它需要160毫秒才能完成,如果我取消注释,它需要大约1秒钟。看起来循环的一部分仍然存在。也许真正的情况是,在消除了所有积垢的情况下,实际的循环在计算上并不太昂贵。一些编译器可能会比其他编译器更积极地这样做。Clang删除了所有循环,代码在我的PC上以.004s的格式运行,gcc保留了一些循环,并在.8s左右运行。不管是哪种方式,这篇文章的主题应该是“只分析有意义的代码,而仅仅把东西放在一个大循环中并不是一个合适的微基准。”
#include <cstdlib>
#include <iostream>

using namespace std;

struct cell {
    int x;
    int y;
};

int main(int argc, char** argv) {
    cell vector[8];
    unsigned long int yy=0;

    for (int aaa = 0; aaa < 8; aaa++) {
        vector[0].x = aaa;
        for (int aab = 0; aab < 8; aab++) {
            vector[0].y = aab;
            for (int aac = 0; aac < 8; aac++) {
                vector[1].x = aac;
                for (int aad = 0; aad < 8; aad++) {
                    vector[1].y = aad;
                    for (int aae = 0; aae < 8; aae++) {
                        vector[2].x = aae;
                        for (int aaf = 0; aaf < 8; aaf++) {
                            vector[2].y = aaf;
                            for (int aag = 0; aag < 8; aag++) {
                                vector[3].x = aag;
                                for (int aah = 0; aah < 8; aah++) {
                                    vector[3].y = aah;
                                    for (int aai = 0; aai < 8; aai++) {
                                        vector[4].x = aai;
                                        for (int aaj = 0; aaj < 8; aaj++) {
                                            vector[4].y = aaj;
                                            for (int aak = 0; aak < 8; aak++) {
                                                vector[5].x = aak;
                                                for (int aal = 0; aal < 8; aal++) {
                                                    vector[5].y = aal;
                                                                    yy++;
                                                                    if(yy%10000000000==0){
                                                                    vector[5].y = aal-1;
                                                                    //std::cout<<yy<<endl;
                                                                    }

                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    std::cout<<yy<<endl;
    std::cout<<vector[5].y<<endl;
    return 0;
}