constexpr против встроенного кода ассемблера - PullRequest
0 голосов
/ 20 апреля 2019

Я сталкивался с этим удивительным онлайн-редактором 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

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 Ответ

2 голосов
/ 20 апреля 2019

constexpr функции не гарантированно выполняются во время компиляции, если они не используются в контексте, где требуется константное выражение .Измените код на

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

, и вы увидите разницу, потому что constexpr переменные необходимо инициализировать с помощью константного выражения .

Обратите внимание, что оптимизацияУровень также имеет значение.

...