Por razones de argumento, vamos a ignorar el caso trivial de los optimizadores que eliminan las diferencias. Digamos también que está utilizando las convenciones de llamadas Intel de 64 bits de Microsoft (que difieren de las de Linux ABI), luego tiene 4 registros de 64 bits para pasar esos valores antes de que tenga que recurrir a empujarlos a la pila. Eso es claramente mejor.
Para una aplicación de 32 bits, por valor e irían directamente a la pila. La referencia puede, por el contrario, poner un puntero en un registro (de nuevo, se permiten algunos de esos usos de registro antes de recurrir a la pila). Podemos esto de alguna salida de g ++ -O3 -S, llamando f1 (99) por su valor y f2 (101) por referencia const:
void f1(int64_t);
void f2(const int64_t&);
int main()
{
f1(99);
f2(101);
}
...
pushl 0
pushl $99
call _Z2f1x // by value - pushed two halves to stack
leal -8(%ebp), %eax
movl %eax, (%esp)
movl $101, -8(%ebp)
movl $0, -4(%ebp)
call _Z2f2RKx // by const& - ugly isn't it!?!
La función llamada tendríamos entonces para recuperar antes del primer uso (si lo hay) La función llamada es libre de almacenar en caché los valores leídos en los registros, por lo que solo es necesario una vez. Con el enfoque de pila, el valor se puede volver a leer a voluntad, por lo que no es necesario reservar el registro para ese valor. Con el enfoque del puntero, es posible que el puntero o el valor de 64 bits deban guardarse en algún lugar más predecible (por ej., Empujado u otro registro menos útil) si dicho registro debe liberarse momentáneamente para algún otro trabajo, pero el de 64 bits El parámetro int se necesita de nuevo más tarde. En general, es difícil adivinar cuál es más rápido, puede depender de la CPU/uso de registro/optimizador/etc., y no vale la pena intentarlo.
un nodo para el consejo de pst ...
"eficiencia" :(BESO pasarlo cómo se pasa cada dos enteros con sangre -.. Pst
... aunque, a veces se aplica a la plantilla de KISS parámetros y hacer que todos sean const T & aunque algunos caben en los registros ....
"eficiencia" :(BESO. Pásalo como pasas todos los enteros sangrientos. –
El compilador probablemente lo optimice de todos modos. –
@pst: +1 para comentario divertido. Hombre me reí muy duro. –