constexpr vs内联汇编代码差异

问题描述 投票:0回答:1

我遇到了这个令人敬畏的在线编辑器https://godbolt.org/,它显示了代码的汇编版本。我还在阅读有关新的C ++ 11功能的文章,并了解了constexpr。

看看下面的方形函数:

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

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

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

constexpr

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

排队

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版本中有一个函数调用代码?根据内联定义,应该避免对吗?

c++11 inline constexpr
1个回答
2
投票

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

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

你会看到差异,因为constexpr变量需要用常量表达式初始化。

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

© www.soinside.com 2019 - 2024. All rights reserved.