Cuando leo litb answer to this question, me enteré de que al pasar una matriz por referencia nos permite obtener su tamaño. Acabo de jugar poco con el código, y trató de pasar a una "función" de referencia y sorprendente (al menos para mí), este código se compila:¿Podría alguien explicar la diferencia entre una "referencia" y un "puntero" en este caso?
void execute(void (&func)()) // func is passed by reference!
{
func();
}
¿Hay alguna diferencia entre la última función, y éste :
void execute(void (*func)()) // func is passed by pointer!
{
func();
}
I trataron usando VC2008, y produce una salida diferente en cada caso. Lo extraño es que el compilador optimiza el código mejor en caso de un puntero de función:
void print()
{
std::cout << "Hello References!";
}
void execute(void (&func)()) // optimized
{
func();
}
int main()
{
00291020 call print (291000h)
}
=========================================
// In this case, the compiler removes all function calls in the code!
void print() // optimized!
{
std::cout << "Hello Pointers!";
}
void execute(void (*func)()) // optimized
{
func();
}
int main()
{
002F1005 push offset string "Hello References!" (2F2124h)
002F100A push eax
002F100B call std::operator<<<std::char_traits<char> > (2F1150h)
}
Tiene que haber una diferencia, aunque yo no lo veo, ¿verdad?
Nota: el código se compiló utilizando VC2008, con /O2
y /Ot
encendido.
EDITAR :: estoy realmente interesado acerca de cualquier diferencia entre las referencias de función y los punteros de función. Examiné el código ensamblador producido solo para ver cómo se traduce en cada caso.
si son sólo interesado en el comportamiento o en los optimizadores información general de referencia de funciones? –
@litb De hecho, me sorprende que pueda pasar una función por referencia. Sería genial si tiene una explicación sobre la diferencia en la funcionalidad u otros aspectos de los indicadores de función :) – AraK