С++: лучше ли передавать перечисление как значение или как ссылку на 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 }
Ответы
Ответ 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. Передайте его по значению.