constexpr与定义的使用案例

时间:2014-10-27 08:38:38

标签: c++11

我一直在使用C ++但从未真正深入细节。最近发现了constexpr,我认为它具有微优化的巨大潜力,但我很难看到如何正确使用它。考虑以下因素:

#define squared(n) (n * n)

constexpr int squared(int n) {
    return n * n;
}

他们都输出相同的东西,但我确定它们是非常不同的。从我的知识定义指令在编译时被替换,因此squared(n)的任何实例都变为(n * n)

显然这是一个简单的例子,但我想知道constexpr在哪里发挥作用?它是否意味着用于比简单文本替换更复杂的操作?使用它的主要优点是什么?它与正常表达式有什么不同?

1 个答案:

答案 0 :(得分:5)

他们根本不输出相同的东西。考虑这个电话:

squared(x++);

或者这堂课:

struct Number
{
  float value() const;
  float squared() const;
  // ... other members
};

如果squared是一个类似函数的宏,那么这两个都会失败。

因此,一如既往:不要使用语言的另一个功能也可以使用宏。你可以说constexpr只允许我们在更少的地方使用宏 - 这是一件好事。

还有一个非常重要的区别:constexpr函数可以(实际上经常是)递归。类似函数的宏不能。