gpt4 book ai didi

c++ - 为什么在运行时而不是在编译时使用 constexpr 初始化变量

转载 作者:行者123 更新时间:2023-12-03 10:05:17 25 4
gpt4 key购买 nike

据我了解,关键字constexpr告诉编译器表达式的评估可以在编译时发生。具体来说,constexpr on a variable 意味着可以在编译时计算变量的值,而 constexpr on a function 意味着可以在编译时调用该函数并评估其返回值。如果函数在运行时被调用,它只是作为一个通用函数。
今天写了一段代码尝试使用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.0290 秒:
$ 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

最佳答案

作者 inspecting生成的程序集,我们可以在 中确认两种情况 G++ 7.5 计算出 fib(32)编译时的值:

    movl    $2178309, %esi
G++ 计算 constexpr 的原因上下文如此之快是由于 memoization它在评估 constexpr 时执行的操作和 template上下文。
记忆化通过将其降低到 O(N) 复杂度来完全消除斐波那契计算复杂度。
那么为什么非- constexpr评价这么慢?我认为这是优化器中的错误/缺点。如果我尝试使用 G++ 8.1 或更高版本,编译时间没有区别,所以大概已经解决了。

关于c++ - 为什么在运行时而不是在编译时使用 constexpr 初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65990306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com