Подтвердить что ты не робот

С++: лучше ли передавать перечисление как значение или как ссылку на const?

Здесь есть два вопроса:

A) Как реализовано перечисление? Например, если у меня есть код:

enum myType
{ 
   TYPE_1,
   TYPE_2
};

Что на самом деле происходит? Я знаю, что вы можете рассматривать TYPE_1 и TYPE_2 как ints, но действительно ли они просто ints?

B). Исходя из этой информации, считая, что перечислимое перечисление не нужно изменять, было бы более целесообразно передать myType в функцию как значение или как ссылку на константу?

Например, лучший выбор:

void myFunction(myType x){ // some stuff }

или

void myFunction(const myType& x) { // some stuff }
4b9b3361

Ответ 1

Скорость мудрая почти наверняка не имеет значения - любой достойный компилятор С++ просто собирается передать один int.

Важным моментом является читаемость - что сделает ваш код более понятным для читателя?

Если очевидно, что эти перечисления действительно просто ints, тогда я передам их по значению, как если бы они были ints. Использование const ref может заставить программиста дважды подумать (никогда не рекомендуется!)

Однако - если вы позже замените их классом, то поддерживайте API одинаково, и использование константы может иметь смысл.

Ответ 2

Стандарт С++ (& section; 7.2/5) гарантирует, что базовый тип перечисления является интегральным типом, который может представлять все значения счетчика, определенные в перечислении. Поэтому передайте его по значению и не делайте код более сложным, чем он может быть.

Ответ 3

Я знаю, что вы можете рассматривать TYPE_1 и TYPE_2 как ints, но на самом деле они просто ints?

Да. Они являются интегральными типами, и, скорее всего, их тип просто int, потому что это наиболее естественный тип. Таким образом, вы можете пройти по значению; передача по ссылке не даст вам каких-либо существенных преимуществ.

Кстати, для вашей справки в разделе §7.2/5 говорится:

Основной тип перечисления является интегральным типом, который может представляют все значения счетчика, определенные в перечислении. это определяемый реализацией, какой интегральный тип используется в качестве основного тип для перечисления, за исключением того, что базовый тип не должен быть больше, чем int, если значение перечислителя не может быть помещено в int или unsigned int. Если список перечислителей пуст, базовый тип как если бы перечисление имело единственный перечислитель со значением 0. значение sizeof(), применяемое к типу перечисления, объект тип перечисления или перечислитель - значение применяемого sizeof() к базовому типу.

Ответ 4

передавать встроенные простые типы (char, short, int, enum, float, указатели) по значению

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

Ответ 5

typedef enum
{
    FIRST_THING,
    SECOND_THING
} myType;

Затем используйте его так же, как int. Передайте его по значению.