假设我在 C 或 C++ 中有以下内容:
#include <math.h>
#define ROWS 15
#define COLS 16
#define COEFF 0.15
#define NODES (ROWS*COLS)
#define A_CONSTANT (COEFF*(sqrt(NODES)))
然后,我去使用 NODES
和 A_CONSTANT
在许多嵌套循环的深处(即使用了很多次)。显然,两者都有可以在编译时确定的数值,但编译器真的这样做了吗?在运行时,CPU 是否必须在每次看到 NODES
时都计算 15*16
,还是编译器会静态地将 240
放在那里?同样,CPU 是否必须在每次看到 A_CONSTANT
时都计算平方根?
我的猜测是 ROWS*COLS
乘法被优化了,但没有其他的。整数乘法内置于该语言中,但 sqrt 是一个库函数。如果情况确实如此,是否有任何方法可以得到一个等于 A_CONSTANT
的魔数(Magic Number),以便在运行时只计算一次平方根?
最佳答案
在将宏定义交给编译器之前,可以通过简单的文本替换将其扩展到源代码中,这可能会进行优化。编译器将为表达式生成完全相同的代码 NODES
, ROWS*COLS
和 15*16
(而且我想不出一个在启用优化的情况下每次循环都会进行乘法运算的方法)。
至于A_CONSTANT
,它又是一个宏这一事实并不重要;重要的是编译器是否足够聪明来弄清楚 sqrt
常数的是常数(假设是 sqrt
来自 <math.h>
)。我知道 GCC 足够聪明,我希望其他生产质量的编译器也足够聪明。
关于c++ - 是否有任何 C 或 C++ 编译器在定义宏中进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796344/