带有任何算术运算符的常量操作数的顺序会影响优化吗?

Bud*_*ika 3 c++ optimization assembly compiler-optimization c++17

假设我们多次定义constconstexpr做简单的算术运算符,变量和函数调用也不会表示或返回常量

    #define NU = 3; //Macro or
    const int NU = 3 // general declaration or constexpr
    auto NU = []()constexpr -> int { return 3;}
    int result = 0;

   #Approach one -> const NU on left side of the operator right side could be function call or a function parameter
    for(int i = 0; i< SOME_MAX; ++i) result = NU * foo(); // function call or
    for(int i = 0; i< SOME_MAX; ++i) result = NU * var; // variable

   #Approach two -> const NU on Right side of the operator Left side could be function call or a function parameter
    for(int i = 0; i< SOME_MAX; ++i) result = foo() * NU ;// function call or
    for(int i = 0; i< SOME_MAX; ++i) result = var * NU; // variable
Run Code Online (Sandbox Code Playgroud)

哪种方法将生成优化的汇编->机器代码?

相对于算术运算符,在LHS或RHS上的常量操作数是否会影响优化性能

注意-在这里我用它来描述我的想法,性能下降或效率低下可以忽略不计,但是,假设使用一组常数进行一组复杂的数学运算。

谢谢。

Bar*_*ool 6

应该是一样的。大多数现代编译器都会在编译时评估并传播常量。该理论称为恒定折叠或恒定传播。

编辑:在哪方面,都应该有所不同。尽管在定理证明中,我认为像coq一样,证明RHS优化要比LHS优化更困难(或者反之亦然……我忘了。)。

  • @BarStool:MSVC`-O3'是一个未知选项,将被忽略;您正在查看调试模式输出!您需要-O2或-Ox来进行MSVC全面优化,这与gcc / clang的-O3不同(如果您的二进制文件只需要在本地运行,则要加上-march = native)。https://gcc.godbolt .org / z / lwa5xz (2认同)