Эффективность применения static_cast() к enum class-ам

Имеется enum class и функция, возвращающая данный тип:

enum class A{
a = 0, b, c, d, e // и тд
};
A get_enum(int x){
    return static_cast<A>(x);
}

Будет ли как-то влиять на скорость работы обратный каст к инту при проверке результата функции:

for(int x=0; x<5; ++x){
   // какая-то работа
   if(get_enum(x) == A::c){} // так?
   if(static_cast<int>(get_enum(x)) == 2){} // или так?
}

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Давайте проверим. Доработаем пример, чтобы выделить функциональность:

#include <iostream>

enum class A {
    a = 0, b, c, d, e // и тд
};

A get_enum(int x) { return static_cast<A>(x); }

bool f(int x) { return get_enum(x) == A::c; }

bool g(int x) { return static_cast<int>(get_enum(x)) == 2; }

int main() {
    int x;
    std::cin >> x;
    std::cout << f(x) << '\n' << g(x) << '\n';
}

Откомпилируем его в ассемблер (-S):

$ g++ -S -std=c++23 -pedantic -Wall -Wextra -Werror -Wwrite-strings -Wconversion temp.cpp

В файле temp.s отыщем код функций f (метка _Z1fi) и g (метка _Z1gi) и сравним их:

f g
_Z1fi:
.LFB2070:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $8, %rsp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %edi
call _Z8get_enumi
cmpl $2, %eax
sete %al
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
_Z1gi:
.LFB2071:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $8, %rsp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %edi
call _Z8get_enumi
cmpl $2, %eax
sete %al
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc

И убедимся что получился один и тот же код. А значит и скорость работы одна и та же.

→ Ссылка