C++ 常量操作数与任何算术运算符的顺序是否会影响优化?

C++ 常量操作数与任何算术运算符的顺序是否会影响优化?,c++,assembly,optimization,c++17,compiler-optimization,C++,Assembly,Optimization,C++17,Compiler Optimization,假设我们定义了const或constexpr,并且我们做了一些简单的算术运算,多次,变量和函数调用也不会表示或返回常量 #定义NU=3//宏或 const int NU=3//一般声明或constexpr 自动NU=[]()constexpr->int{return 3;} int结果=0; #接近一->运算符右侧左侧的常量NU可以是函数调用或函数参数 对于(int i=0;i,切换到不同的编译器并查看生成的输出,MSVC是迄今为止我得到的最差的。查看iCCx64、clang、arm、gcc,例

假设我们定义了
const
constexpr
,并且我们做了一些简单的算术运算,多次,变量和函数调用也不会表示或返回常量

#定义NU=3//宏或
const int NU=3//一般声明或constexpr
自动NU=[]()constexpr->int{return 3;}
int结果=0;
#接近一->运算符右侧左侧的常量NU可以是函数调用或函数参数
对于(int i=0;i运算符左侧右侧的常量NU可以是函数调用或函数参数
对于(int i=0;i
哪种方法将生成优化的装配->机器代码

关于算术运算符,常量操作数是在LHS上还是在RHS上将影响优化性能

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


谢谢。

应该是一样的大多数现代编译器将在编译时计算和传播常量。这一理论被称为或常数传播


编辑:就哪一方而言,它不应该是不同的。虽然,我认为在定理证明器中,比如coq,证明RHS优化比证明LHS优化更困难(或者相反……我忘了)

这种微观优化应该很少或永远都不需要。请花些时间阅读,以及,和。然后,请编辑您的问题,以包括您试图解决的问题、您为什么需要这个问题,或者这仅仅是出于好奇。还请注意,此类微优化往往非常特定于编译器(甚至可能是特定于编译器的版本)。如果您想找到答案,可以在上尝试您的编译器。(我并不期望有显著的差异(如果有的话)顺便说一句:
#define NU=3
=>
#定义NU 3
。MSVC搞得一团糟,因为@Scheff的链接很傻:MSVC不支持
-O3
/O3
,所以它会忽略它并在调试模式下编译。使用
-O2
-Ox
进行MSVC的全面优化。(但是,
-O3
用于使用gcc或clang进行全面优化)。显示MSVC按预期工作:
mov-edx,9
for
NU()*3
。感谢回复栏凳子,你能通过这个->,切换到不同的编译器并查看生成的输出,MSVC是迄今为止我得到的最差的。查看iCCx64、clang、arm、gcc,例如:)您是否发现一些奇怪的事情?似乎MSVC只进行了一轮常量折叠,所以它仍然会乘以第一个常量。我认为其中一个很有趣。叮当声甚至会为您折叠循环:)@BarStool:MSVC
-O3
是一个被忽略的未知选项;您正在查看调试模式输出!您需要
-O2
-Ox
进行MSVC完全优化,这与gcc/clang的
-O3
不同(如果二进制文件只需要在本地运行,则加上
-march=native
    #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