我一直在使用C ++但从未真正深入细节。最近发现了constexpr
,我认为它具有微优化的巨大潜力,但我很难看到如何正确使用它。考虑以下因素:
#define squared(n) (n * n)
和
constexpr int squared(int n) {
return n * n;
}
他们都输出相同的东西,但我确定它们是非常不同的。从我的知识定义指令在编译时被替换,因此squared(n)
的任何实例都变为(n * n)
。
显然这是一个简单的例子,但我想知道constexpr
在哪里发挥作用?它是否意味着用于比简单文本替换更复杂的操作?使用它的主要优点是什么?它与正常表达式有什么不同?
答案 0 :(得分:5)
他们根本不输出相同的东西。考虑这个电话:
squared(x++);
或者这堂课:
struct Number
{
float value() const;
float squared() const;
// ... other members
};
如果squared
是一个类似函数的宏,那么这两个都会失败。
因此,一如既往:不要使用语言的另一个功能也可以使用宏。你可以说constexpr
只允许我们在更少的地方使用宏 - 这是一件好事。
还有一个非常重要的区别:constexpr
函数可以(实际上经常是)递归。类似函数的宏不能。