wie funktionieren referenzen genau?



  • #include <iostream>
    const char NL = '\n';
    using std::cout;
    
    void pause(){ std::cin.get(); }
    
    int main()
    {
        int    i = 42;
        int&  rI =  i;
        int& rrI = rI;
        cout << & i   << ' ' <<     i << NL;
        cout << & rI  << ' ' <<    rI << NL;
        cout << & rrI << ' ' <<   rrI << NL;
        pause();
    
        int*   pI =  &i;
        int** ppI = &pI;
        cout << & i   << ' ' <<     i << NL;
        cout << & pI  << ' ' <<   *pI << NL;
        cout << & ppI << ' ' << **ppI << NL;
        pause();
    }
    

    Wie man weiß, findet man bei Zeigern immer den Ort der Speicherung, sodass man direkt auf die Adresse zugreifen kann. Wie funktioniert das bei Referenzen genau? Z.B. die Referenz auf die Referenz?



  • Eine "Referenz auf eine Referenz" ist wieder eine einfache Referenz. Was genau willst du wissen?



  • wie funktionieren referenzen exakt? interner mechanismus? wo wird die adresse abgelegt? was passiert mit referenz auf referenz genau?



  • rrI ist quatsch. beim initialisieren von rrI, also bei rrI=rI wird ja rI benutzt und rI meint direkt schon I. rrI zeigt also mit sicherheit auf I, nicht auf rI. an rI kann man nicht mehr kommen. ist rI einmal mit I initialisiert, kommt man an rI nie mehr dran. alles, was man mit rI zu machen versucht, geschieht automagisch mit I. in diesem zusammenhang (aber evtl nur hier) ist es nutzreich, referenzen nur als andere namen für was zu sehen. rI ist nur ein anderer Name für I. solche referenzen wie hier haben nichtmal speicher. und hätten sie den, käme man trotdem nicht dran.
    int* pI=&rI;
    zieht sich ja die adresse von I, denn wenn man rI benutzt, benutzt man automatisch das I, wo rI hinzeigt. nur an die Adresse von I konnte ich kommen. das erlaubt den compilerbauern so einige tricks. insbesondere konnen sie solche referenzen total wegoptimieren. sie sind nachher einfach nicht mehr da, weil der comiler auch hier die "anderewr name"-sichtweise kennt und einfach überall für rI ein I einsetzt.



  • noopee schrieb:

    wie funktionieren referenzen exakt? interner mechanismus? wo wird die adresse abgelegt? was passiert mit referenz auf referenz genau?

    Das kann der Compiler nach Gutdünken machen. Oft werden sie als Pointer realisiert, manchmal kann der Compiler den Pointer jedoch weglassen und direkt mit der referenzierten Variable arbeiten.



  • Wenn du es genau wissen willst, lass die doch einfach Assembler Code von deinem Compiler ausgeben. Beim GCC geht das ganz einfach mit der -S Option



  • Optimizer: Der Compiler kann auch Zeiger nach Gutdünken implementieren, solange ihm keiner auf die Finger guckt (z.b. den Zeiger verändert, volatile macht, die Adresse davon nimmt etc.) Bei Referenzen hat man diese Manipulationsmöglichkeiten lediglich nicht, ansonsten gibt es auf der Ebene der Implementation wahrscheinlich nicht so viele Unterschiede zwischen Referenzen und Zeigern.


Anmelden zum Antworten