我编写了一个简单的递归函数,并添加了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

最佳答案

由于未使用plusOne调用的结果,因此这些调用将被完全丢弃,并且您的示例程序实质上会测量对high_resolution_clock::now的第一次调用与后续调用之间的差异。您可以swap arguments and get similar results

关于c++ - 为不同的参数评估constexpr函数时的运行时差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49463348/

10-13 05:02