【发布时间】:2023-03-24 06:21:01
【问题描述】:
假设我们定义了const 或constexpr,并且我们多次执行简单的算术运算符,变量和函数调用也不会表达或返回常量。
#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
哪种方法会生成优化的程序集 -> 机器码?
对于算术运算符而言,LHS 或 RHS 上的常量操作数是否会影响 优化 或 性能?
注意 - 在这里我用它来描绘我的想法,性能损失或效率低下可以忽略不计,但假设使用一堆常量进行复杂的数学运算。
谢谢。
【问题讨论】:
-
应该很少或永远需要这种微优化。请花一些时间阅读how to ask good questions、this question checklist 和the XY problem。然后请编辑您的问题,包括您尝试解决的问题、您为什么需要这个,或者这是否只是出于好奇。
-
另请注意,此类微优化往往是特定于编译器的(甚至可能是特定于编译器的版本)。
-
如果你想知道,你可以在Compiler Explorer上试试你的编译器。 (并不是说我预计会有显着差异。)
-
顺便说一句:
#define NU = 3;=>#define NU 3. -
MSVC 搞得一团糟,因为@Scheff 的链接很傻:MSVC 不支持
-O3或/O3,所以它会忽略它并在调试模式下编译。使用-O2或-Ox进行MSVC 的全面优化。 (但-O3使用 gcc 或 clang 进行全面优化)。 gcc.godbolt.org/z/lwa5xz 显示 MSVC 按预期工作:mov edx, 9forNU() * 3。
标签: c++ assembly optimization c++17 compiler-optimization