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