首页 > 解决方案 > constexpr 说明符性能没有达到我在 C++ 中的期望

问题描述

我刚刚了解到 constexpr 说明符函数可以在编译过程中运行,我尝试在 VS 2017 中使用 Debug x86 Mode 检查实际性能,结果显示它们之间存在微小的时间差异。它仍然经过了很多时间,而不是“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;
}

标签: c++visual-studioc++11c++14compiler-optimization

解决方案


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

您可以更改此行:

static const auto c_x = c_fun(40);

至:

constexpr auto c_x = c_fun(40);

查看编译器的输出。在铿锵声中,它告诉我:

note: constexpr evaluation hit maximum step limit;

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

如果您将 40 更改为某个合理的数字(例如 10),一切都会好起来的:

constexpr auto c_x = c_fun(10);

推荐阅读