因此,从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();
}
constexpr函数是在编译时而不是在执行过程中计算的,只要作为参数传递给它的值是一个常量即可。
不,编译器可以自行决定这样做,就像使用not的“纯”函数一样constexpr
。除非您在需要编译时常量的上下文中使用它,例如constexpr变量的初始化,或者在数组绑定中使用(但要提防VLA g ++扩展),或者用作非类型模板参数。对于这些情况,需要进行编译时评估。(这不是详尽的列表:还有其他需要编译时间常数的上下文,例如开关用例标签,但是如何将用例标签值发送给cout
?)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句