c++ - C++14 中的 "constexpr"

标签 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();
}

最佳答案

A constexpr function is computed during compile time and not during execution, as long as the value being passed to it as a parameter is a constant.

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

关于c++ - C++14 中的 "constexpr",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32599545/

相关文章:

c++ - 如何将元素插入到唯一指针的多维 vector 中?

c++ - 捕获具有特定模板参数的类

c++ - 'x' 和 L'x' 之间的关系并加宽 ('x' )

c++ - Qt OpenCV - 显示转换帧时的 SIGSEGV

c# - C# 中的 typedef 等效于使用 C++ DLL

c++ - 在现代 C++ 中使用 try..catch block 通过模板元编程包装任意函数调用

c++ - 迭代 C++ 列表中一对(或元组)的特定项

c++ - 为什么 ZeroMQ PUSH/PULL 可以工作,而 PUB/SUB 不行?

c++ - 在 C++11 中对数组中所有元素的 OR/AND 成员进行 OR/AND 的优雅方式?

c++ - 使用常规构造函数进行聚合初始化