C++ constexpr的性能更差?

C++ constexpr的性能更差?,c++,performance,c++11,constexpr,C++,Performance,C++11,Constexpr,我试图使用constexpr评估性能差异。我正在使用以下代码: #include<iostream> using namespace std; constexpr double factorial(int n) { return n==0?1:n*factorial(n-1); } main() { double a=0; for(int i=0;i<10000000;i++) { a+=factorial(100); }

我试图使用
constexpr
评估性能差异。我正在使用以下代码:

#include<iostream>
using namespace std;

constexpr double factorial(int n) {

    return n==0?1:n*factorial(n-1);
}

main() {
    double a=0;
    for(int i=0;i<10000000;i++) {
        a+=factorial(100);

    }
    cout<<a<<endl;
}
#包括
使用名称空间std;
constexpr双阶乘(int n){
返回n==0?1:n*阶乘(n-1);
}
main(){
双a=0;

for(int i=0;i
constepr
在编译时进行计算时是有利的。但是,编译器不需要这样做,除非您需要,例如通过使
a
constepr
。在运行时
constepr
对函数没有影响


正如预期的那样,我在测试中得到了非常接近的结果(δ~0.1s)。

在认真考虑这个基准之前的第一件事(尽管可能不适用于这种情况,因为时间非常长)--您的循环每次都做完全相同的事情。优化器可能只跳过这项工作并执行一次。尝试对阶乘求和并输出结果。第二,您可以发布程序集吗?我无法真正复制您的结果(使用GCC 5.2):我查看了clang上的程序集输出。大致相同。编译时未对该函数进行求值。如果将参数和返回类型更改为
long
,则会是。我怀疑constexpr函数中整数和浮点数学的混合会阻止它成为constexpr(浮点异常的可能性?)