Wie funktionieren Zeiger auf Funktionen?



  • Hallo miteinander.

    Ich weiß, dass das Aufrufen einer Funktion via Zeiger darauf, die Möglichkeit eröffnet, eine Funktion als Parameter an eine andere Funktion zu übergeben. Des Weiteren heißt es ja, das Arbeiten mit Zeigern sei oft effizienter.
    Ich frage mich allerdings, was das Aufrufen einer Funktion mittels Zeiger ausmacht. Ist das schneller oder nur praktischer (je nach Verwendung)? Wenn ich eine Funktion über einen Zeiger aufrufe (also einen "Bezugspunkt" auf diese habe), wird die dann nach einem Rücksprung genauso vom Stack gepoppt, als wenn ich sie normal aufrufen würde.
    Ich frage mich einfach nur, was macht den Sinn, bzw. Vorteil eines Aufrufs via Zeiger aus, und wenn das schneller ist, warum?

    Danke fürs Reinschauen.

    Gruß
    Kai



  • _Bongo schrieb:

    Des Weiteren heißt es ja, das Arbeiten mit Zeigern sei oft effizienter.

    "Oft" heißt aber auch "nicht immer".
    Einen Zeiger zu dereferenzieren braucht auch Zeit.
    Möglicherweise hast du diese Aussage von der Arraybearbeitung. Das ist aber etwas anderes.

    _Bongo schrieb:

    Ich frage mich allerdings, was das Aufrufen einer Funktion mittels Zeiger ausmacht. Ist das schneller oder nur praktischer (je nach Verwendung)?

    Im ersten Satz hast du doch schon eine Antwort gegeben "... eine Funktion als Parameter an eine andere Funktion zu übergeben."

    _Bongo schrieb:

    Wenn ich eine Funktion über einen Zeiger aufrufe (also einen "Bezugspunkt" auf diese habe), wird die dann nach einem Rücksprung genauso vom Stack gepoppt, als wenn ich sie normal aufrufen würde.

    Die Funktion selber steht nicht auf dem Stack. Da liegen nur die Variablen (und Rücksprungadressen).
    In C räumt übrigens die rufende Funktion den Stack auf, da (nur) sie weiß, wieviel Paramter sie übergeben hat (z.B bei printf )



  • Ist der Aufruf über einen Zeiger schneller oder ist das egal, ob diese über einen Zeiger aufgerufen wird oder "normal"?



  • Funktionszeiger sind nützlich wenn man "branch free" programmieren will. https://m.reddit.com/r/programming/comments/i839f/branchfree_programming/



  • Funktionen können nicht "über Zeiger" oder "normal" aufgerufen werden, Funktionsnamen zerfallen immer in einen Zeiger und das nicht nur (wie Arrays) als Funktionsargument sondern auch sonst immer.
    Der Aufruf von

    f();
    (*f)();
    

    ist völlig äquivalent, d.h. da ist nichts "schneller" o.ä.
    Funktionszeiger werden häufig als Callback verwendet, siehe qsort,bsearch,signal.



  • Alles klar. Ich danke Euch für die Infos.

    Vielleicht noch eines: dieses Zerfallen habe ich auch schon einmal im Zusammenhang mit Zeigern gehört. Ist zerfallen gleichbedeutend mit auflösen?


Anmelden zum Antworten