gpt4 book ai didi

c++ - constexpr 说明符性能不符合我在 C++ 中的预期

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:54 24 4
gpt4 key购买 nike

我刚刚了解到 constexpr 说明符函数可以在编译过程中运行,我尝试使用 Debug x86 Mode 在 VS 2017 中检查实际性能,结果显示它们之间存在微小的时间差异。它仍然经过了很多时间而不是“0”。我做错了什么吗,谁能帮助我,非常感谢!

#include <iostream>
#include <time.h>

size_t r_fun(size_t n) noexcept
{
if (n == 0) return 0;
if (n == 1) return 1;
return r_fun(n - 1) + r_fun(n - 2);
}

constexpr size_t c_fun(size_t n) noexcept
{
if (n == 0) return 0;
if (n == 1) return 1;
return c_fun(n - 1) + c_fun(n - 2);
}


int main()
{
clock_t start, finish;

start = clock();
auto r_x = r_fun(40);
finish = clock();
std::cout <<"result:"<< r_x<< "\ttime:" << (double)(finish - start) << std::endl;

start = clock();
static const auto c_x = c_fun(40);
finish = clock();
std::cout << "result:" << c_x << "\ttime:" << (double)(finish - start) << std::endl;

return 0;
}

最佳答案

您的 constexpr 函数需要太多计算才能在编译器中完成,这就是编译器选择将其延迟到运行时执行的原因。

你可以改变这一行:

static const auto c_x = c_fun(40);

到:

constexpr auto c_x = c_fun(40);

查看编译器的输出。在 clang 上,它告诉我:

note: constexpr evaluation hit maximum step limit;

c_x 确实是一个编译时常量,但由于实现限制,编译器无法计算它。请注意,您的函数具有指数复杂度。

Everything will be fine如果您将 40 更改为某个合理的数字,例如 10:

constexpr auto c_x = c_fun(10);

关于c++ - constexpr 说明符性能不符合我在 C++ 中的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685216/

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