2014-03-01 61 views
3

我得到constepxt构建函数有点糊涂..C++ 11:constexpr构造性能

请问以下是一样快(或更快)

while(true) 
{ 
    constexpr std::chrono::hours one_hour(1); 
    .. 
} 

比(只创建一个实例) :

while(true) 
{ 
    static constexpr std::chrono::hours one_hour(1); 
    .. 
} 

换句话说,constexpr ctor意味着没有任何运行时间开销?

+0

生成两种替代方案的汇编代码,均未优化和优化,并检查差异。我敢打赌,至少优化后的代码不会有任何区别。 –

+0

对。但我对这个概念感兴趣。 constexpr ctor意味着没有运行时间开销什么 - 所以曾经? – GabiMe

回答

8

是否constexpr ctor意味着没有任何运行时间开销?

如有疑问,可以随时查询;例如:

#include <chrono> 

template <long Long> 
class dummy { }; 

int main() { 

    constexpr std::chrono::hours one_hour(1); 

    dummy<one_hour.count()> d; 
} 

它编译的事实意味着one_hour是编译时间常数正因为如此,已经没有运行时开销任何。

+0

_是一个编译时间常量,因此没有任何运行时间开销 - - 不是真的。它必须存在于应用程序中,就像在运行时初始化的值一样。 'constexpr'基本上说这个值在编译时是可用的。 –

+0

*“必须在应用程序中存在”*不一定。如果编译器能够验证你永远不会接收它的地址,我相信它可以代替'one_hour'的所有事件,就好像它来自一个宏,比如'#define one_hour 1'。它确实在我的机器上做到了这一点;我看着大会。 – Ali

+0

你说得对。 _“它必须存在于应用程序中”_ - 我的意思是作为对象存在(如果地址被占用)或其值在机器代码中硬编码(如果它曾被使用过)。 –

1

添加constexpr这里不会有太大的区别,因为std::chrono持续时间和时间点只包含一个整数成员。换一种说法。初始化的性能与int相同。