# constexpr关键字

# 为什么有const关键字还引入constexpr?

const修饰的变量表示变量只读或为常量。

constexprc++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