C ++: лучше ли передавать перечисление как значение или как константную ссылку? - PullRequest
19 голосов
/ 26 июля 2011

Здесь есть два связанных вопроса:

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

enum myType
{ 
   TYPE_1,
   TYPE_2
};

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

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

Например, какой вариант лучше:

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

или

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

Ответы [ 5 ]

17 голосов
/ 26 июля 2011

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

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

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

8 голосов
/ 26 июля 2011

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

1 голос
/ 26 июля 2011

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

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

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

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

0 голосов
/ 26 июля 2011
typedef enum
{
    FIRST_THING,
    SECOND_THING
} myType;

Тогда используйте это как int.Передайте его по значению.

0 голосов
/ 26 июля 2011

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

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

...