2010-11-06 20 views
9

duplicados posibles:
How to pass objects to functions in C++?
is there any specific case where pass-by-value is preferred over pass-by-const-reference in C++?¿Es mejor pasar por valor o por referencia para los tipos de datos básicos?

Tengo miembros de una clase implementada como esto:

void aaa(int a, float b, short c) 
{ 
    bbb(a, b); 
} 

void bbb(int a, float b) 
{} 

Si los valores de A, B y C se almacenados en mi clase como constantes, entonces hubiera sido mejor/sensato usar mis funciones como se muestra a continuación o como se muestra arriba?

void aaa(int& a, float& b, short& c) 
void bbb(int& a, float& b) 

¿El uso de referencias da ventajas de velocidad o ventajas en este caso? Cualquier desventaja/gastos generales de referencias aquí?

+1

Ok, ¿qué son todos esos '*' sobre ?! –

+0

Supongo que necesita editar el formato int ** & ** no tiene sentido :-) –

+0

StaterOverflow agregó los asteriscos. Se suponía que el sitio web debía enviar las letras entre asteriscos a Bold. Lo eliminará porque no está convirtiendo. – Nav

Respuesta

4

El estándar no tiene restricciones sobre la implementación de referencias, sin embargo, generalmente se implementan como punteros auto-referenciados (en realidad con algunas excepciones). Como probablemente sepa, el tamaño del puntero del sistema de 32 bits es de 4 bytes, lo que significa que pasar caracteres, cortos (tipos con tamaño de (menos de 4 bytes) por referencia puede considerarse algo excesivo: usar 4 bytes en lugar de 1 (caracteres) o 2 (corto). En general, depende de si los rigisters o stack se usan para pasar parámetros: puede guardar un poco de stack al pasar tipos básicos por valor, pero en el caso de registros incluso para chars, se usarán 4 bytes, por lo que no tiene sentido tratando de optimizar algo con ptrs/refs.

+0

Tenga en cuenta que hay otra diferencia en el rendimiento: cuando se utiliza un int directamente, el valor está presente en el registro o en la pila, mientras que al pasar las referencias (asumiendo un puntero autoreferenciado) el valor real tiene que ser recuperado con un extra indirección, eso sería innecesario si pasa por valor. –

+0

-1 Por propagar conceptos erróneos sobre el uso de la pila. Pasar un 'char', por ejemplo, en la pila, generalmente usará 4 bytes de espacio de pila en un sistema de 32 bits. En C y C++, la misma razón subyacente se refleja en la promoción automática a 'int'. En resumen, el uso del espacio de la pila no tiene nada que ver con eso para los tipos pequeños. En cambio, tiene que ver con el tiempo del programador, cuánto necesita escribir y cuánto necesita leer, es decir, la eficiencia del programador, y tiene que ver con una posible indirección adicional, es decir, la eficiencia del programa. –

+0

Uh, ¿quién votó de nuevo esta respuesta incorrecta? –

3

Si utiliza referencias, hacerlos const:

void bbb(const int & a, const float & b); 

De lo contrario, la semántica serán diferentes de paso por valor, ya que la función podría cambiar el valor de las variables pasadas a los parámetros. Esto implicaría que no podrías usar literales para los argumentos.

1

No veo la razón por la cual sería más rápido. Debe enviar el parámetro a la función en ambos casos. Si la función obtiene puntero en lugar de valor, entonces el puntero necesita desreferenciación que podría ser más lenta que enviar un valor simple.

+0

En el caso de un puntero '*', habrá eliminación de referencias, en el caso de una * referencia * '&', no habrá ninguna "sobrecarga" involucrada. Para tipos más grandes que el registro nativo utilizado para argumentos de función (normalmente el tamaño de una dirección de memoria), en teoría es mejor pasar referencias en lugar de objetos enteros por valor. – rubenvb

+0

@rubenvb: El hecho de que no es necesario desreferencia explícita no significa que no haya una desreferencia implícita. En muchos (¿todos?) Compiladores, las referencias se implementan como punteros desreferenciados automáticamente. El uso de una referencia implica una indirección implícita en el ensamblador generado (a menos que la función esté en línea, donde el compilador puede usar las variables reales) –

+0

Creo que estamos hablando de algo como 'int' o' float'. Sin embargo, el * y el es casi una sintaxis diferente para el parámetro de tipo puntero, así que supongo que David está aquí. – tia

4

En el caso de los tipos ordinales - es decir, int, float, bool, etc. - no se ahorra al usar una referencia en lugar de simplemente usar el valor de paso por. SourceSource2

Cuestiones relacionadas