C++11:constexpr构造函数性能

3

我有点困惑constepxt ctors的含义。

以下代码是否和原代码一样快(或更快)?

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

比起(仅创建一个实例):

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

换句话说,constexpr构造函数是否意味着完全没有运行时开销?

生成两种选择的汇编代码,包括未优化和优化的,并检查它们之间的差异。我敢打赌,至少对于优化后的代码,不会有任何差别。 - Some programmer dude
没错。但我对这个概念很感兴趣。constexpr构造函数是否意味着完全没有运行时开销? - GabiMe
2个回答

8
constexpr构造函数是否意味着完全没有运行时开销?

当你有疑问时,你总是可以进行检查;例如:

#include <chrono>

template <long Long>
class dummy { };

int main() {

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

  dummy<one_hour.count()> d; 
}

这段话的意思是:代码能够编译通过,这意味着one_hour是一个编译时常量,因此在运行时没有任何额外的开销。

“is a compile time constant and as such, has no runtime overhead whatsoever” - 不完全是这样。它必须存在于应用程序中,就像在运行时初始化的值一样。constexpr 基本上表示该值在编译时作为常量可用。 - Maxim Egorushkin
“它必须存在于应用程序中”并非一定如此。如果编译器能够验证您从未获取其地址,我相信它可以将所有one_hour的出现替换为类似于#define one_hour 1的宏。在我的机器上,它确实这样做了;我查看了汇编代码。 - Ali
你是对的。我指的是它必须存在于应用程序中,即作为一个对象存在(如果地址被占用),或者其值硬编码在机器代码中(如果它被使用)。 - Maxim Egorushkin
@MaximYegorushkin 同意。但是你怎么可能做得比那更好呢?:) 在我看来,这意味着没有额外开销。如果您认为这种措辞令人困惑或错误,请提出更好的建议。 - Ali
正如我之前提到的,std::chrono 的持续时间和时间点只是整数的包装器,使用硬编码整数值或仅在运行时已知的值可能没有太大区别。当进行算术运算时,CPU 仍然必须将其加载到寄存器中。但是,我同意您的观点,如果该值在编译时已知,则某些操作可以更有效地完成,例如,如果它是2的幂,则所有乘法/除法都可以转换为更便宜的寄存器移位。 - Maxim Egorushkin

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接