如何在C++中定义pow2宏

rem*_*emo -1 c++ macros performance euclidean-distance

我想对pow2C的定义如下.但我的编译器显示它(__tmpDouble__)已经定义.请帮我定义一下.

#ifndef pow2C
double __tmpDouble__;
#define pow2C(a) ((__tmpDouble__=(a))*(__tmpDouble__))
#endif

.
.
.

inline double calculateDistance(double *x, double *y, int NDims) 
{
    double d = 0;
    for (int i = 0; i < NDims; i++)
    // it is faster to calculate the difference once
       d += pow2C(x[i] - y[i]);
    return sqrt(d);
}
Run Code Online (Sandbox Code Playgroud)

lee*_*mes 8

如果您坚持编写宏,请为变量使用不同的名称.但你的宏非常可怕.首先,对于并发调用,它不是线程安全的,因为线程将访问相同的临时变量.此外,大多数宏一般都是非常邪恶的(尽管有一些例外).

但是,相同(也是性能方面)可以更容易地实现(即使支持floatoperator*使用功能模板的其他类型:

template <typename T>
T square(const T &v) {
    return v * v;
}
Run Code Online (Sandbox Code Playgroud)

如果你想要一个宏,那么#define pow2C square(sarcasm sign).


Sea*_*ean 5

这是定义宏的一种可怕方式!您不应该将变量作为计算的一部分引入.相反,试试这个:

#define pow2C(a) ((a) * (a))
Run Code Online (Sandbox Code Playgroud)

然而,宏对于这种计算是可怕的,因为它们可能是低效的并且导致不希望的副作用.例如,如果您编码它将扩展为:

 (x[i] - y[i]) * (x[i] - y[i])
Run Code Online (Sandbox Code Playgroud)

你做过两次减法的地方!

相反,使用C++模板:

template<class T>
T pow2C(const T &value)
{
  return value * value;
}
Run Code Online (Sandbox Code Playgroud)

现在你只进行一次减法计算!

  • 答案的前半部分正是*为什么*他想要使用变量的原因...... (3认同)