4Manuals

  • PDF Cloud HOME

在不使用返回值的情况下,g ++编译器是否将constexpr函数视为常规函数? Download

    获取Hough线的交点OpenCV C ++ 如何将字符串“ text1”设置为包含项目text1,text2,test3的组合框的选定项目? 为什么System.Net.Mail.MailAddress构造函数在域部分中解析带有斜杠“ /”的电子邮件? Android 10,API29:在应用程序文件夹中使用C ++库编写文件会使应用程序崩溃 Unity-LineRenderer没有出现在版本(2D)上 按下按钮后,电话中未显示通知 ASP.net,使用WebConfig httpErrors重定向到区域内的控制器不起作用 获取会议室详细信息 我们如何将参数Line转换为Station? 网络核心:查找实体框架核心的主键和反射

我试图查看由g ++编译的cpp constexpr函数的编译代码。 我看到如果函数没有返回任何东西,而编译器则将其视为常规函数,但是如果它返回一个值,并且将该值分配给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

如您所见,它在运行时称为func。相反,如果我将函数结果赋给constexpr:

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 个答案:

答案 0 :(得分:6)

允许编译器决定在编译时还是在运行时评估constexpr函数。只有在需要编译时常数表达式的上下文中使用该函数时(例如,使用结果初始化constexpr变量),编译器必须在编译时评估该函数。

在第一个示例中,情况并非如此,就像您可能在调试模式下进行编译一样,该函数在运行时就像其他函数一样被调用。

cppreference中的一句话(我强调):

  

constexpr说明符声明可能在编译时评估函数或变量的值。这样的变量和函数可以在仅允许编译时常量表达式的情况下使用(前提是给出了适当的函数参数)。

如果您使用例如编译第一个示例-O3,您会发现该函数调用已优化。



Similar searches
    在新标签/窗口中打开VF页面 输出单元格值的简单代码在C ++中给出了运行时SIGABRT错误 为什么结构化绑定不支持变量? 我想要特定于数组的数组项的值的总和,直到最后没有达到? IE / Edge浏览器子窗口中的React应用程序中断