C ++中的“constexpr”14

时间:2015-09-16 03:59:39

标签: c++ c++11 c++14 constexpr

因此,从C ++ 14开始,constexpr在C ++ 11中的限制已经消失,例如constexpr函数中有新的变量或循环。

最新版本的GCC和Clang编译器已经支持它们。

所以问题是这个...... constexpr函数是在编译期间而不是在执行期间计算的,只要作为参数传递给它的值是常量。所以我在下面写的函数的结果应该在执行期间瞬间出现,对吧?但事实并非如此。

我的问题是:为什么会这样?我是否对C ++ 14的constexpr功能有错误的理解?谢谢。

编辑:是的,我使用-OO,这就是为什么它不起作用。但设置-O1或更高速度优化可以解决问题并且程序按预期执行。谢谢大家的答案。

#include <iostream>
#include <chrono>

constexpr long long addition(long long num)
{
    long long sum = 0;
    for (int i = 0; i <= num; i++)
    {
        sum += i;
    }

    return sum;
}

int main()
{
    auto start = std::chrono::steady_clock::now();
    //////////////////////////////////////////////

    std::cout << addition(500000000);  //500 mill //executes in 1.957 seconds

    ///////////////////////////////////////////////
    auto stop = std::chrono::steady_clock::now();
    auto dur = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
    std::cout << "\n\nIt took " << static_cast<double>(dur.count()) / 1000 << " seconds!";

    std::cin.get();
}

1 个答案:

答案 0 :(得分:14)

  

constexpr函数在编译期间而不是在执行期间计算,只要作为参数传递给它的值是常量。

不,编译器可以自行决定这样做,就像使用&#34; pure&#34;功能不是constexpr。除非您在需要编译时常量的上下文中使用它,例如constexpr变量的初始化,或者在数组绑定中使用(但要注意VLA g ++扩展)或作为非类型模板参数。对于这些情况,需要编译时评估。 (这不是一个详尽的列表:还有其他上下文需要编译时间常量,例如开关案例标签,但是如何将案例标签值发送到cout?)