2014-10-27 53 views
3

我一直在使用C++,但从未真正深入细节。最近发现约constexpr,我认为它具有微优化的巨大潜力,尽管我很难看到如何正确使用它。考虑到以下几点:constexpr的使用案例与定义

#define squared(n) (n * n) 

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

他们都输出同样的事情,但我敢肯定,他们有很大的不同。根据我的知识,定义指令在编译时被替换,因此squared(n)的任何实例都只是(n * n)

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

+2

'squared(i ++)'... – 2014-10-27 08:43:54

+2

或'squared(1 + 1)'...... – Henrik 2014-10-27 08:49:40

+0

@Henrik好的,但是可以通过在内部使用'(n)'来获得帮助,所有“理智的宏“(就像那个表达所表达的那样是矛盾的)。 – Angew 2014-10-27 08:52:54

回答

5

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

squared(x++); 

或者这个类:

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

如果squared是一个函数宏这两就会失败。

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

还有一个,非常重要的区别:constexpr功能可以(并且确实经常是)递归。函数式的宏不能。

+0

谢谢你清理它。 – 2014-10-28 09:08:09