我有点困惑constepxt ctors的含义。
以下代码是否和原代码一样快(或更快)?
while(true)
{
constexpr std::chrono::hours one_hour(1);
..
}
比起(仅创建一个实例):
while(true)
{
static constexpr std::chrono::hours one_hour(1);
..
}
换句话说,constexpr构造函数是否意味着完全没有运行时开销?
我有点困惑constepxt ctors的含义。
以下代码是否和原代码一样快(或更快)?
while(true)
{
constexpr std::chrono::hours one_hour(1);
..
}
比起(仅创建一个实例):
while(true)
{
static constexpr std::chrono::hours one_hour(1);
..
}
当你有疑问时,你总是可以进行检查;例如:
#include <chrono>
template <long Long>
class dummy { };
int main() {
constexpr std::chrono::hours one_hour(1);
dummy<one_hour.count()> d;
}
one_hour
是一个编译时常量,因此在运行时没有任何额外的开销。constexpr
基本上表示该值在编译时作为常量可用。 - Maxim Egorushkinone_hour
的出现替换为类似于#define one_hour 1
的宏。在我的机器上,它确实这样做了;我查看了汇编代码。 - Alistd::chrono
的持续时间和时间点只是整数的包装器,使用硬编码整数值或仅在运行时已知的值可能没有太大区别。当进行算术运算时,CPU 仍然必须将其加载到寄存器中。但是,我同意您的观点,如果该值在编译时已知,则某些操作可以更有效地完成,例如,如果它是2的幂,则所有乘法/除法都可以转换为更便宜的寄存器移位。 - Maxim Egorushkinconstexpr
并不会有太大的区别,因为std::chrono
的持续时间和时间点只包含一个整数成员。换句话说,初始化的性能与int
相同。