C ++ 14中的“ constexpr”

代代

因此,从C ++ 14开始,constexprC ++ 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();
}
本·沃格特

constexpr函数是在编译时而不是在执行过程中计算的,只要作为参数传递给它的值是一个常量即可。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++ 11/14中的静态const与constexpr成员字段?

如何在 C++14 中定义静态 constexpr 矩阵?

在C ++ 14 Standard中,哪里表示不能在constexpr函数的定义中使用非constexpr函数?

什么是C ++中的constexpr?

使C ++ 14 constexpr函数与C ++ 11兼容

理解C ++ 14宽松的constexpr限制

C ++中的Constexpr迭代器

C ++ 11中的constexpr概念

格式错误,无需诊断(NDR):C ++ 14中抛出了ConstExpr函数

在C ++ 14中,constexpr成员可以更改数据成员吗?

是否可以在C ++ 14中分配和验证constexpr结构?

在C ++ 14中将constexpr intializer_list传递为参数

构造函数中的C ++ 14 constexpr联合条件初始化

指向C ++ 17中constexpr静态成员的constexpr指针

C ++ 14我应该多久使用一次constexpr?

使用constexpr数组作为模板非类型参数(C ++ 14)

C ++ 14静态constexpr成员数组链接失败

带有odr用法的c ++ 14静态constexpr auto

C ++ 14:从参数值初始化constexpr变量

C ++中的constexpr指针和内存管理

是否在C ++中内联了静态constexpr变量?

如何在C ++中创建constexpr函数

在内联函数的定义中使用 constexpr 变量时可能发生的 ODR 违规(在 C++14 中)

这种constexpr虚拟函数技术是否违反任何C ++ 11 / C ++ 14规则?

将基于 constexpr 的 C++17 模板化代码转换为 C++14

在C ++ 17中的constexpr函数中修改全局变量

C ++ 11中ConstExpr对象中的可变成员

在C ++中,lambda是否必须捕获constexpr表达式?

如何在C ++ 17中编写constexpr快速排序?