Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为不同参数计算constexpr函数时的运行时差异_C++_Optimization_Constexpr - Fatal编程技术网

C++ 为不同参数计算constexpr函数时的运行时差异

C++ 为不同参数计算constexpr函数时的运行时差异,c++,optimization,constexpr,C++,Optimization,Constexpr,我编写了一个简单的递归函数,并添加了一个constexpr标志,以指示编译器可以在编译时计算它。 当我用两个不同的参数调用这个函数时,我会得到不同的运行时结果。为什么呢 代码: 由于未使用plusOne调用的结果,这些调用将被完全丢弃,您的示例程序基本上测量对高分辨率时钟::now的第一次调用和后续调用之间的差异。您可以您不是在需要在编译时计算它的上下文中计算它(例如,模板参数、数组大小等)。因此,编译器可以选择要执行的操作。您必须检查程序集以查看实际发生的情况。您使用的优化和调试标志是什么?我

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

代码:


由于未使用
plusOne
调用的结果,这些调用将被完全丢弃,您的示例程序基本上测量对
高分辨率时钟::now
的第一次调用和后续调用之间的差异。您可以

您不是在需要在编译时计算它的上下文中计算它(例如,模板参数、数组大小等)。因此,编译器可以选择要执行的操作。您必须检查程序集以查看实际发生的情况。您使用的优化和调试标志是什么?我发现了问题:代码是在调试模式下编译的。当使用Release时,我们确实得到了类似的结果。谢谢@BoBTFish和S.M。
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