不确定这两种方式哪个更好(更快):
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);
};
中使用它们。它取决于编译器吗?
答案 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;
}
通过这种方式,您可以使用通用方法(与宏一样)但具有两个优点:
constexpr
个参数,将在编译时进行评估。至于你的确切问题:
现代编译器擅长优化。实际上非常好。我怀疑,由于这些优化,两个版本将花费相似的时间来执行。但是,如果不对您的构建配置进行分析,那只是猜测。
答案 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 );
- 如果v比较小于hi,则返回v和lo中较大的一个, 否则返回v和hi中较小的一个。使用运算符&lt;比较 价值。
- 与(1)相同,但使用comp来比较值。
醇>
答案 3 :(得分:0)
我想,您应该信任c ++编译器并使用函数代替宏,因为它可以执行一些优化,如内联(这将为您完成所有必要的工作)。此外,在c ++中使用宏是不好的做法,这可能导致错误