2011-07-26 25 views
12

Hay dos preguntas relacionadas de este tipo:C++: ¿Es mejor pasar una enumeración como un valor o como una referencia constante?

A) ¿Cómo se implementa enum? Por ejemplo, si tengo el código:

enum myType 
{ 
    TYPE_1, 
    TYPE_2 
}; 

¿Qué está sucediendo realmente? Sé que puedes tratar a TYPE_1 y TYPE_2 como a ints, ¿pero en realidad son solo enteros?

B) En base a esa información, suponiendo que la enum aprobada no necesita ser cambiada, ¿tendría más sentido pasar myType en una función como un valor o como una referencia constante?

Por ejemplo, cuál es la mejor opción:

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

o

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

Respuesta

11

Speedwise es casi seguro que no importa - cualquier compilador C++ decente solo va a pasar una sola int.

El punto importante es la legibilidad, lo que hará que su código sea más obvio para el lector.

Si es obvio que estas enumeraciones son realmente simples, las pasaría por valor, como si fueran enteros. El uso de la const ref puede hacer que un programador lo piense dos veces (¡nunca es una buena idea!)

Sin embargo, si luego va a reemplazarlos por una clase, mantener la API igual y aplicar la consistencia podría tener sentido .

0

pase tipos incorporados simples (char, short, int, enumeración, flotador, punteros) por valor

las enumeraciones se implementan como enteros, incluso puede especificar valores explícitos para ellas.

0
typedef enum 
{ 
    FIRST_THING, 
    SECOND_THING 
} myType; 

Luego úsela como una int. Pásalo por valor.

1

Sé que se puede tratar TYPE_1 y TYPE_2 como ents, pero ¿son en realidad solo acertados?

Sí. Son de tipo integral, y muy probablemente su tipo es solo int porque es el tipo más natural. Entonces 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 entero que puede representar todos los valores de enumerador definidos en la enumeración. Es definido por la implementación el que se utiliza tipo integral como el tipo subyacente de una enumeración excepto que el tipo subyacente no será mayor que int a menos que el valor de un empadronador no puede caber en un int o unsigned int. Si la enumeradora-lista está vacía, el tipo subyacente es como si la enumeración tuviera un único enumerador con valor 0.El valor de sizeof() aplicado a un tipo de enumeración, un objeto del tipo enumeración o un enumerador, es el valor de sizeof() aplicado al tipo subyacente.

8

C++ estándar (§ 7,2/5) garantiza que el tipo subyacente de una enumeración es un tipo integral que puede representar todos los valores empadronador 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.

Cuestiones relacionadas