constexpr与内联汇编代码的区别

时间:2019-04-20 10:39:02

标签: c++11 inline constexpr

我遇到了一位很棒的在线编辑器https://godbolt.org/ 显示代码的汇编版本。 我还阅读了有关C ++ 11的新功能的信息,并了解了constexpr。

看看下面的平方函数:

constexpr int square(int num) {
    return num * num;
}

int main()
{
    int result = square(2);
    return 0;
}

以及为两个版本(constexpr和内联)生成的以下汇编代码

CONSTEXPR

main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 4
        mov     eax, 0
        pop     rbp
        ret

INLINE

square(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     edi, 2
        call    square(int)
        mov     DWORD PTR [rbp-4], eax
        mov     eax, 0
        leave
        ret

我到处都读到可以内联这样的函数,但是为什么在asm版本中有一个函数调用代码?根据内联定义,应该避免吧?

1 个答案:

答案 0 :(得分:1)

plus = incBy函数不能保证在编译时执行,除非在需要恒定表达式的上下文中使用它们。将您的代码更改为

constexpr

,您会发现有所不同,因为int main() { constexpr int result = square(2); return 0; } 变量需要使用恒定表达式进行初始化。

请注意,优化级别也很重要。