Als ich litb answer to this question gelesen habe, habe ich gelernt, dass das Übergeben eines Arrays durch Referenz uns ermöglicht, seine Größe zu erhalten. Ich spielte nur wenig mit Code und versuchte, eine „Funktion“ durch Verweis übergeben und überraschend (zumindest für mich), dieser Code kompiliert:Könnte jemand bitte den Unterschied zwischen einer "Referenz" und einem "Zeiger" in diesem Fall erklären?
void execute(void (&func)()) // func is passed by reference!
{
func();
}
Gibt es einen Unterschied zwischen der letzten Funktion, und dieser :
Ich versuchte es mit VC2008, und es produziert in jedem Fall unterschiedliche Ausgabe. Das Merkwürdige ist, dass der Compiler den Code besser im Fall eines Funktionszeigers optimiert:
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)
}
Es muss ein Unterschied sein, obwohl ich es nicht sehen, nicht wahr?
Hinweis: Der Code wurde unter Verwendung von VC2008 erstellt, mit /O2
und /Ot
eingeschaltet.
EDIT :: Ich bin wirklich daran interessiert, über jeden Unterschied zwischen Funktionsreferenzen und Funktionszeiger. Ich habe den produzierten Assembler-Code untersucht, nur um zu sehen, wie er in jedem Fall übersetzt wird.
sind Sie nur Interesse an dem Optimizern Verhalten oder in allgemeine Funktionsbezugsinformation? –
@litb Ich bin eigentlich überrascht, dass ich eine Funktion per Referenz übergeben konnte. Es wäre großartig, wenn Sie eine Erklärung über den Unterschied in der Funktionalität oder andere Aspekte von Funktionszeigern haben :) – AraK