在为不同参数评估constexpr函数时的运行时差异

时间:2018-03-24 09:53:25

标签: c++ optimization constexpr

我写了一个简单的递归函数,并添加了一个constexpr标志来指示编译器可以在编译时计算它。 当我用两个不同的参数调用这个函数时,我得到不同的运行时结果。那是为什么?

代码:

constexpr int plusOne(int i)
{
    return (i > 0) ? i + plusOne(i - 1) : 0;
}

#include <chrono>
int main() {

    auto start = std::chrono::high_resolution_clock::now();
    auto finish = std::chrono::high_resolution_clock::now();
    start = std::chrono::high_resolution_clock::now();
    plusOne(200);
    finish = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish - start).count() << "ns\n";

    start = std::chrono::high_resolution_clock::now();
    plusOne(100);
    finish = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish - start).count() << "ns\n";

}

输出:

32472ns
3021ns

1 个答案:

答案 0 :(得分:1)

由于未使用plusOne次调用的结果,因此完全放弃这些调用,并且您的示例程序主要测量对high_resolution_clock::now的第一次和后续调用之间的差异。你可以swap arguments and get similar results