假设我有
#define DETUNE1 sqrt(7)-sqrt(5)
#define DETUNE2 sqrt(11)-sqrt(7)
我在我的程序中多次调用这些。
DETUNE1 和 DETUNE2 是否在每次被调用时计算?
最佳答案
Are DETUNE1 and DETUNE2 calculated every time it is called?
不太可能。
因为您使用常量调用 sqrt
,大多数编译器会优化对 sqrt
函数的调用并将其替换为常量值。 GCC 在 -O1
处执行此操作。 clang也是。 (See live)。
在一般情况下,如果您有一个将 n
作为运行时值的宏:
#define DETUNE1(n) (sqrt(n)-sqrt(n))
然后在文本替换之后,至少 sqrt
函数之一需要计算。
请注意您的宏不安全。为了安全起见,你应该在它周围加上括号。例如,DETUNE1 * DETUNE1
不会产生您期望的结果。
关于C++/C#定义宏计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30995253/