据我了解,该关键字constexpr
告诉编译器对表达式的求值可以在编译时进行。具体来说,constexpr
在变量上意味着可以在编译时评估变量的值,而constexpr
在函数上意味着可以在编译时调用此函数并评估其返回值。如果在运行时调用该功能,则它仅充当通用功能。
今天,我写了一段代码尝试使用constexpr
:
#include <iostream>
using namespace std;
constexpr long int fib(int n)
{
return (n <= 1)? n : fib(n-1) + fib(n-2);
}
int main ()
{
constexpr long int res = fib(32);
// const long int res = fib(32);
cout << res << endl;
return 0;
}
我原以为代码的编译会花费很多时间,但是我错了。只需花费0.0290s来进行编译:
$ time g++ test.cpp
real 0m0.290s
user 0m0.252s
sys 0m0.035s
但是,如果我更改constexpr long int res = fib(32);
为const long int res = fib(32);
,令我惊讶的是,它在编译上花费了更多时间:
$ time g++ test.cpp
real 0m5.830s
user 0m5.568s
sys 0m0.233s
简而言之,似乎 const
使函数fib(32)
在编译时进行评估,但constexpr
使它在运行时进行评估。我真的很困惑
我的系统:Ubuntu 18.04
我的gcc:g ++(Ubuntu 7.5.0-3ubuntu1〜18.04)7.5.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句