我试图查看由g ++编译的cpp constexpr函数的编译代码。
我看到如果函数没有返回任何东西,而编译器则将其视为常规函数,但是如果它返回一个值,并且将该值分配给constexpr变量,则只有在编译时才进行计算。 代码示例: 和编译器输出: 如您所见,它在运行时称为func。相反,如果我将函数结果赋给constexpr: 和编译器输出: 有人可以解释一下为什么编译器需要在编译时而不是运行时评估此功能的原因吗? 答案 0 :(得分:6) 允许编译器决定在编译时还是在运行时评估constexpr函数。只有在需要编译时常数表达式的上下文中使用该函数时(例如,使用结果初始化 在第一个示例中,情况并非如此,就像您可能在调试模式下进行编译一样,该函数在运行时就像其他函数一样被调用。 cppreference中的一句话(我强调): constexpr说明符声明可能在编译时评估函数或变量的值。这样的变量和函数可以在仅允许编译时常量表达式的情况下使用(前提是给出了适当的函数参数)。 如果您使用例如编译第一个示例constexpr int func(int x){
return x!=0 ? 1: throw "Error";
}
int main(){
func(2);
}
push rbp
mov rbp, rsp
mov edi, 2
call func(int)
mov eax, 0
pop rbp
ret
constexpr int func(int x){
return x!=0 ? 1: throw "Error";
}
int main(){
constexpr int x = func(2);
}
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 1
mov eax, 0
pop rbp
ret
1 个答案:
constexpr
变量),编译器必须在编译时评估该函数。
-O3
,您会发现该函数调用已优化。