Quando ho letto litb answer to this question, ho imparato che passare un array per riferimento ci consente di ottenere le sue dimensioni. Ho appena giocato po 'con il codice, e ho cercato di passare una "funzione" di riferimento e sorprendentemente (almeno per me), questo codice compila:Qualcuno potrebbe spiegare la differenza tra un "riferimento" e un "puntatore" in questo caso?
void execute(void (&func)()) // func is passed by reference!
{
func();
}
C'è qualche differenza tra l'ultima funzione, e questo :
void execute(void (*func)()) // func is passed by pointer!
{
func();
}
Ho provato utilizzando VC2008 e produce output diversi in ogni caso. La cosa strana è che il compilatore ottimizza il codice migliore in caso di un puntatore a funzione:
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)
}
Ci deve essere una differenza, anche se io non lo vedo, giusto?
Nota: il codice è stato compilato utilizzando VC2008, con /O2
e /Ot
attivato.
EDIT :: Sono molto interessati circa l'eventuale differenza tra riferimenti alle funzioni e puntatori a funzione. Ho esaminato il codice assembly prodotto solo per vedere come viene tradotto in ogni caso.
sono semplicemente interessati al comportamento ottimizzatori o in informazioni generali sulla funzione di riferimento? –
@litb Sono davvero sorpreso di poter passare una funzione per riferimento. Sarebbe fantastico se tu avessi una spiegazione sulla differenza di funzionalità o altri aspetti dai puntatori di funzione :) – AraK