tipo - C++: ¿Es mejor pasar una enumeración como un valor o como una referencia constante?
typedef enum c++ ejemplo (5)
Hay una especie de dos preguntas relacionadas aquí:
A) ¿Cómo se implementa la enumeración? Por ejemplo, si tengo el código:
enum myType
{
TYPE_1,
TYPE_2
};
¿Qué está pasando realmente? Sé que puedes tratar a TYPE_1 y TYPE_2 como ints, ¿pero en realidad son solo ints?
B) Sobre la base de esa información, suponiendo que la enumeración aprobada no fuera necesario cambiar, ¿tendría más sentido pasar myType a una función como un valor o como una referencia constante?
Por ejemplo, cual es la mejor opción:
void myFunction(myType x){ // some stuff }
o
void myFunction(const myType& x) { // some stuff }
Sé que puedes tratar a TYPE_1 y TYPE_2 como ints, ¿pero en realidad son solo ints?
Sí. Son de tipo integral, y lo más probable es que su tipo sea solo int
porque ese es el tipo más natural. Así puedes pasar por valor; pasar por referencia no le daría ninguna ventaja significativa.
Por cierto, para su referencia, la sección §7.2 / 5 dice:
El tipo subyacente de una enumeración es un tipo integral que puede representar todos los valores del enumerador definidos en la enumeración. Está definido por la implementación qué tipo de integral se usa como el tipo subyacente para una enumeración, excepto que el tipo subyacente no será mayor que int, a menos que el valor de un enumerador no se ajuste a un int o unsigned int. Si la lista de enumeradores está vacía, el tipo subyacente es como si la enumeración tuviera un solo enumerador con valor 0. El valor de sizeof () aplicado a un tipo de enumeración, un objeto de tipo de enumeración o un enumerador, es el valor de sizeof () aplicado al tipo subyacente.
El Estándar C ++ (§7.2 / 5) garantiza que el tipo subyacente de una enumeración es un tipo integral que puede representar todos los valores del enumerador definidos en la enumeración. Así que pásalo por valor y no hagas que tu código sea más sofisticado de lo que puede ser.
En cuanto a la velocidad, es casi seguro que no importa: cualquier compilador decente de C ++ solo pasará un solo int.
El punto importante es la legibilidad: ¿qué hará que su código sea más obvio para el lector?
Si es obvio que estas enumeraciones son realmente solo ints, entonces las pasaría por valor, como si fueran ints. Usar la referencia constante puede hacer que un programador lo piense dos veces (¡nunca es una buena idea!)
Sin embargo, si luego los va a reemplazar con una clase, entonces mantener la API igual y hacer cumplir la constancia podría tener sentido.
pasar tipos simples incorporados (char, short, int, enum, float, punteros) por valor
Las enumeraciones se implementan como enteros, incluso puede especificar explícitamente los valores para ellos.
typedef enum
{
FIRST_THING,
SECOND_THING
} myType;
Entonces utilízalo como un int. Pásalo por valor.