2012-05-26 15 views
5

Por lo que entiendo, no debe pasar tipos simples por referencia en C++ porque no mejora el rendimiento, incluso es malo para el rendimiento (?). Al menos eso es lo que logré reunir de la red.Razones para no pasar tipos simples por referencia?

Pero no puedo averiguar el motivo por qué es malo para el rendimiento, ¿es porque es más rápido para C++ simplemente crear un nuevo tipo simple de lo que es buscar variable o qué es?

+1

Incluso sin consideraciones de "rendimiento", los parámetros de referencia cambian la semántica de la llamada ... –

+0

Me gustaría esperar que esto sea una optimización del compilador si pasa por referencia constante (el compilador lo convertiría en un pase por valor). –

Respuesta

6

Si crea una referencia, es:

pointer to memory location -> memory location 

Si utiliza un valor, que es:

memory location 

Desde un valor tiene que ser copiado de cualquier manera (la referencia o el valor) , pasar por referencia no mejora el rendimiento; una búsqueda adicional tiene que hacerse. Por lo tanto, teóricamente "empeora" el rendimiento, pero no por la cantidad que jamás notará.

+0

Esa es una respuesta engañosa. _ "Dado que un valor tiene que ser copiado de cualquier manera" _. Pasar por ref no resulta en copiar el valor, sino que usa operaciones de puntero en el mismo objeto. Así que pasar un 'doble' significa crear una copia del 'doble' (si es un valor l) y usar esa copia en la función. Pasar una referencia significa que pasa el puntero a la función y realiza la desreferenciación, siempre que se use el valor, pero sin poner la var en la pila. Si tiene un func con un argumento que llama a otro con un valor arg, entonces solo el segundo asignará la var en la pila. –

+0

@AdamHunyadi: Pasar por resultados de referencia en un puntero que se está copiando (hasta optimizaciones). Eso es lo que quise decir con "un valor". (Puede verlo leyendo el paréntesis justo después de la parte que citó). – Ryan

0

Las referencias internas se tratan en punteros, que deben desreferenciarse cada vez que se accede a ellos. Eso obviamente requiere operaciones adicionales.

+0

Las referencias no son punteros. Tampoco debería pensar en las referencias como punteros (solo hace que pensar en ellos sea más difícil). –

+0

Estoy de acuerdo con las referencias creadas en un ámbito local, pero ¿qué hay de pasar material a los métodos como referencia? Si no pasa por el valor (léase: ponga una copia en la pila), su única otra opción es pasar un puntero al objeto al que se hace referencia. Debe pasar algo, a través de pila o registros, por lo que debe ser el valor completo o un puntero a él. Y dado que las referencias claramente no son los valores completos, deben ser punteros. Prefiero pensar en ellos en la forma "simplemente funciona" de C# y Java, pero internamente funcionan como punteros autoreferenciados. – Wormbo

+0

Está mapeando construcciones de lenguaje (punteros/referencias) en los detalles de implementación ahora. Esto es aún menos útil. –

0

Por ejemplo, en el modo de 32 bits, int el tamaño es de 4 bytes y int * el tamaño del puntero es de 4 bytes. Pasar 4 bytes int directamente es más rápido, que pasar el puntero de 4 bytes y luego cargar int con ese puntero.

+0

@Loki Astari: El parámetro en algunas configuraciones siempre se carga desde la memoria (debería ser un puntero o valor), pero si es un puntero, habrá otra carga de la memoria, que no es el caso en el que el valor se pasa como parámetro. – Ruben

2

Es una buena pregunta y el hecho de que la pidas muestra que estás prestando atención a tu código. Sin embargo, la buena noticia es que en este caso particular, hay una salida fácil.

Este excelente artículo de Dave Abrahms responde a todas sus preguntas y algo más: Want Speed? Pass by Value.

Honestamente, no hace la justicia enlace resumirlo, es necesario leer -un real. Sin embargo, para abreviar, su compilador es lo suficientemente inteligente como para hacerlo correctamente y si intenta hacerlo manualmente, puede evitar que su compilador realice ciertas optimizaciones.

Cuestiones relacionadas