c++ - 是否有任何 C 或 C++ 编译器在定义宏中进行优化?

标签 c++ c c-preprocessor compiler-optimization

假设我在 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)))

然后,我去使用 NODESA_CONSTANT 在许多嵌套循环的深处(即使用了很多次)。显然,两者都有可以在编译时确定的数值,但编译器真的这样做了吗?在运行时,CPU 是否必须在每次看到 NODES 时都计算 15*16,还是编译器会静态地将 240 放在那里?同样,CPU 是否必须在每次看到 A_CONSTANT 时都计算平方根?

我的猜测是 ROWS*COLS 乘法被优化了,但没有其他的。整数乘法内置于该语言中,但 sqrt 是一个库函数。如果情况确实如此,是否有任何方法可以得到一个等于 A_CONSTANT 的魔数(Magic Number),以便在运行时只计算一次平方根?

最佳答案

在将宏定义交给编译器之前,可以通过简单的文本替换将其扩展到源代码中,这可能会进行优化。编译器将为表达式生成完全相同的代码 NODES , ROWS*COLS15*16 (而且我想不出一个在启用优化的情况下每次循环都会进行乘法运算的方法)。

至于A_CONSTANT ,它又是一个宏这一事实并不重要;重要的是编译器是否足够聪明来弄清楚 sqrt常数的是常数(假设是 sqrt 来自 <math.h> )。我知道 GCC 足够聪明,我希望其他生产质量的编译器也足够聪明。

关于c++ - 是否有任何 C 或 C++ 编译器在定义宏中进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796344/

相关文章:

c++ - 有没有更优雅的方法在构造函数中声明默认变量?

c - 即使在调用 fclose() 之后,由于 fopen() 而导致的内存泄漏

c - 从 Allegro 加载位图后神秘崩溃

运行 getline 后无法读取单个字符

c++ - 避免双重包含 : Preprocessor directive vs. makefile

c++ - 在 boost 线程中读取标志

c++ - 试图理解 C++14 中的 [expr.const]

c++ - 静态变量 undefined reference

c - 使用类对象宏是定义全局变量的好方法吗?

c++ - C++ 中的_USE_MATH_DEFINES (VS2010)