Adresse einer Funktion



  • Vielen Dank Leute, jetzt verstehe ich das ganze.
    Noch eine kurze Frage, bei Templates verhält es sich doch genau so? Wenn ein Template instanziert wird( ich meien jetzt Template-Funktionen) und es nicht geinlint wird, dann schreibt der Compiler ja die entsprechende Version der Funktion und diese kommt dann logischerweise auch in den Arbeitsspeicher oder?

    Lg freeG



  • die jeweilige spezialisierung, natürlich. aber ein bisschen aufpassen musst du in deinen formulierungen. der compiler schreibt die objektdateien, und natürlich erzeugt er code für jede (implizite oder explizite) instanziierung eines funktionstemplates, einmal; (edit: schau dir im standard kapitel 3.2 zur one-definition-rule an) genauso, wie er für jede inline-funktion mit externer linkage nur etwas erzeugt, das sich so verhält, als gäbe es es nur einmal. dir kann, wenn du bei standard c++ bleibst, zuerst mal völlig egal sein, wer was wie erzeugt und was in den arbeitsspeicher wann und wo und wie geladen wird. C++ (03) macht hier sowieso wenige garantien, was reihenfolgen oder so etwas anbelangt. der standard garantiert dir nur, dass von jeder funktion mit externer linkage du jederzeit einen funktionszeiger auf diese funktion bekommen kannst, der über alle übersetzungseinheiten hinweg denselben "wert" haben muss, den du in einen beliebigen anderen funktionszeiger (aber nicht elementfunktionszeiger oder "normalen" zeiger) oder nach bool konvertieren kannst (oder in einen integralen typen, der groß genug ist) und wieder zurück, so dass nach der rückkonvertierung der zeiger wieder auf dasselbe "ding" zeigt.

    aber der standard garantiert dir z.b. nicht einmal folgendes:

    //foo.cpp
    int foo () { return 0; }
    
    //main.cpp
    int foo ();
    
    typedef void (*fun_ptr) ();
    
    int main ()
    {
       fun_ptr ptr = reinterpret_cast<fun_ptr>(foo());
       assert (ptr == 0); 
    }
    

Anmelden zum Antworten