gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:24:17 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com