# constexpr关键字
# 为什么有const
关键字还引入constexpr
?
const
修饰的变量表示变量只读或为常量。
constexpr
是c++11
中引入的关键字,用来修饰表达式,告诉编译器,这个表达式有可能是一个常量表达式,也就是在编译期就可以确定表达式的值,这样能减少在运行时的计算,提高程序的性能。
# 示例
#include <chrono>
#include <iostream>
constexpr int add(int x, int y)
{
return x + y;
}
int add1(int x, int y)
{
return x + y;
}
int main(int argc, char **argv)
{
int n = 100000000;
auto t1 = std::chrono::system_clock::now();
for(size_t i = 0; i < n; i++) {
int res = add(11, 12);
}
auto t2 = std::chrono::system_clock::now();
auto d = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
std::cout << "time taken by constexpr add: " << d << "ms\n";
int x = 11, y = 12;
t1 = std::chrono::system_clock::now();
for(size_t i = 0; i < n; i++) {
int res = add(x, y);
}
t2 = std::chrono::system_clock::now();
d = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
std::cout << "time taken by variable constexpr add: " << d << "ms\n";
t1 = std::chrono::system_clock::now();
for(size_t i = 0; i < n; i++) {
int res = add1(11, 12);
}
t2 = std::chrono::system_clock::now();
d = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
std::cout << "time taken by ordinary add: " << d << "ms\n";
return 0;
}
如上代码,最终的输出如下:
time taken by constexpr add: 191ms
time taken by variable constexpr add: 320ms
time taken by ordinary add: 285ms
可以看到使用constexpr
能够大幅提升程序的性能,但是当传入变量到constexpr
修饰的函数时,其无法在编译时确定值,因此性能没有提升。
# reference
← 前向声明 explicit修饰符 →