#define或typed函数?

mar*_*zzz 1 c++ optimization function

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

// 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);
};    
Run Code Online (Sandbox Code Playgroud)

在两者中我都会用它们double.它取决于编译器吗?

Bat*_*eba 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Bathsheba,你错了:)参见讲座.`inline`关键字作为链接器指令具有非常特定的含义.标题中的常规函数​​(不是模板)将产生"多重定义"错误,除非使用`inline`关键字标记.当然,人们可以问*为什么*在标题中有一个函数定义,但这是完全不同的事情.:) (3认同)
  • @barakmanos,编译器非常擅长弄清楚何时内联,何时不知道.平均而言,他们比"优化"开发人员产生更好的运行代码,他们认为他们知道何时内联. (2认同)