#define或typed函数?

时间:2016-11-07 10:48:24

标签: c++ function optimization

不确定这两种方式哪个更好(更快):

Doxyfile

我将在// first #define BOUNDED(x,lo,hi) ((x) < (lo) ? (lo) : (x) > (hi) ? (hi) : (x)) // second double Bounded(double x, double lo, double hi) { return fmax(fmin(x, hi), lo); }; 中使用它们。它取决于编译器吗?

4 个答案:

答案 0 :(得分:10)

C ++中的经验法则是尽可能避免使用宏

例如,如果我传递BOUNDED(x++, low++, hi++)之类的内容,您的宏将会重复评估参数。

如果你想保留宏的通用性质,那么为什么不写

template<typename Y>
inline Y Bounded(Y x, Y lo, Y hi)
{
    return x < lo ? lo : x > hi ? hi : x;
}

我看不出这比宏观方法慢。请注意,编译器可能会在其认为合适时忽略inline。描述性能以确定。您可以考虑为大型类型传递const Y& x等,但这可能会使Y = double案例的更慢

答案 1 :(得分:4)

如果我是你,我会选择功能并使其模板化constexpr

template<typename T>
constexpr T Bounded(T x, T lo, T hi)
{
    return x < lo ? lo : x > hi ? hi : x;
}

通过这种方式,您可以使用通用方法(与宏一样)但具有两个优点:

  1. 您可以使用概念(一旦他们输入标准:))来约束传递到模板中的类型。
  2. 如果您传递constexpr个参数,将在编译时进行评估。
  3. 至于你的确切问题:

    现代编译器擅长优化。实际上非常好。我怀疑,由于这些优化,两个版本将花费相似的时间来执行。但是,如果不对您的构建配置进行分析,那只是猜测。

答案 2 :(得分:2)

我将添加此内容以保证完整性。一旦c ++ 17出现,你可以使用std::clamp

template<class T>
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp );
  
      
  1. 如果v比较小于hi,则返回v和lo中较大的一个,   否则返回v和hi中较小的一个。使用运算符&lt;比较   价值。
  2.   
  3. 与(1)相同,但使用comp来比较值。
  4.   

答案 3 :(得分:0)

我想,您应该信任c ++编译器并使用函数代替宏,因为它可以执行一些优化,如内联(这将为您完成所有必要的工作)。此外,在c ++中使用宏是不好的做法,这可能导致错误