Fragen zu Referenzen



  • Bin immer noch am lernen von Referenzen und Zeigern. Ich möchte da in details verstehen:

    Ich les grad Referenzen haben keinen Speicherplatz.

    Wenn es keinen Speicherplatz hat, also nicht auf RAM, wo wird die Definition Referenz abgelegt?

    Oder gar nicht - wird etwa beim kompilieren weggelöscht?

    int i = 5;
    int &r = i;
    ++r;
    

    wird nach dem compilieren nur noch so aussehen?

    int i = 5; 
    ++i;
    

    Weil Referenz=Alias wie im Windows haben Verknüpfungen als anklickbare Icons auch ein bißchen kilobytes.

    2. Zweite Frage im Zusammenhang mit Konstante:

    "Ein Read-Only-Bezeichner kann im Gegensatz zu einer "normalen" Referenz mit einer Konstanten initialisiert werden:

    const double &pi = 3.14159;
    

    ist das dann sowas wie

    const double pi = 3.14159;
    

    ??

    "Da die Konstante keinen Speicherplatz besitzt, legt der Compiler ein temporäres Objekt an, das referenziert wird."

    Also temporäres Objekt selber belegt schon Speicherplatz oder?
    Wenn ich "cout << &pi << endl;" mach, seh ich die Speicheradresse.

    was ist der Unterschied zwischen

    int& r = i;
    

    und

    int &r = i;
    

    nur Lesbarkeit?



  • Zu 1.

    Ich les grad Referenzen haben keinen Speicherplatz.

    Wer hat dir den Unsinn erzählt? Klar belegen auch Referenzen Speicher. Nur (meist) nicht so viel wie die Referenzierten Objekte selbst.

    Der Trick dabei ist, das Objekte (z.B. bei Übergabe an Funktionsparameter) nicht Kopiert werden müssen, was enorm viel Zeit beanspruchen kann.

    Zu 2.
    Ja, kann genauso verwendet werden.

    Zu 3.
    Keiner



  • xBlackKnightx schrieb:

    Ich les grad Referenzen haben keinen Speicherplatz.

    Wenn es keinen Speicherplatz hat, also nicht auf RAM, wo wird die Definition Referenz abgelegt?

    Oder gar nicht - wird etwa beim kompilieren weggelöscht?

    int i = 5;
    int &r = i;
    ++r;
    

    wird nach dem compilieren nur noch so aussehen?

    int i = 5; 
    ++i;
    

    jup. in dem fall belegt die refertenz keinen speicherplatz. der compiler optimiert das schon, genau wie du angenommen hast.
    aber wenn du referenzen als members oder als funktionsparameter benutzt, belegen sie so viel wie ein zeiger.



  • Hallo liebe community nochmal,

    Wer hat dir den Unsinn erzählt? Klar belegen auch Referenzen Speicher. Nur (meist) nicht so viel wie die Referenzierten Objekte selbst.

    und kann man diese adressen auch wiedergeben? ich seh nur die adresse von orginal-variable?

    neue Frage:

    ich les grad diesen Text http://tutorial.schornboeck.net/referenzen.htm
    ganz unten steht dass es eine referenz-falle gibt. ich hab diesen quellcode kompilieren lassen und das Ergebnis kommt trotzdem 7 raus statt undefinied oder so

    hat der compiler das etwa korrigiert oder wie?
    (mein compiler von visual studio 2005)

    vielen dank



  • hat der compiler das etwa korrigiert oder wie?

    Nö, der hat nicht wirklich was korrigiert, aber er hat Code erzeugt der grad zufällig trotzdem geht. Der Punkt ist dass du dich nicht darauf verlassen kannst dass es geht, und dass der Standard sagt dass es undefiniertes Verhalten ist, aka böse 🙂
    Mit anderen Worten: es zu verwenden nur weil es in einem einfachen Beispiel geht ist ganz ganz schlecht.

    Füge mal zwischen dem Funktionsaufruf und der "cout" Zeile ca. sowas ein:

    char buffer[1024]={};
        sprintf(buffer, "%d", time(0));
    

    Denke dann wird das programm nichtmehr 7 anzeigen.



  • hustbaer schrieb:

    hat der compiler das etwa korrigiert oder wie?

    Nö, der hat nicht wirklich was korrigiert, aber er hat Code erzeugt der grad zufällig trotzdem geht. Der Punkt ist dass du dich nicht darauf verlassen kannst dass es geht, und dass der Standard sagt dass es undefiniertes Verhalten ist, aka böse 🙂
    Mit anderen Worten: es zu verwenden nur weil es in einem einfachen Beispiel geht ist ganz ganz schlecht.

    Füge mal zwischen dem Funktionsaufruf und der "cout" Zeile ca. sowas ein:

    char buffer[1024]={};
        sprintf(buffer, "%d", time(0));
    

    Denke dann wird das programm nichtmehr 7 anzeigen.

    hmm tatsächlich! Ich musste time(0) löschen, weil der Compiler das nicht kennt. Was sollte man includieren?

    Ich bin blutiger Anfänger!



  • achso hab...es ist #include <ctime>



  • xBlackKnightx schrieb:

    Hallo liebe community nochmal,

    Wer hat dir den Unsinn erzählt? Klar belegen auch Referenzen Speicher. Nur (meist) nicht so viel wie die Referenzierten Objekte selbst.

    und kann man diese adressen auch wiedergeben? ich seh nur die adresse von orginal-variable?

    Alles andere wäre Unsinn!



  • David_pb schrieb:

    xBlackKnightx schrieb:

    Hallo liebe community nochmal,

    Wer hat dir den Unsinn erzählt? Klar belegen auch Referenzen Speicher. Nur (meist) nicht so viel wie die Referenzierten Objekte selbst.

    und kann man diese adressen auch wiedergeben? ich seh nur die adresse von orginal-variable?

    Alles andere wäre Unsinn!

    meinst also, dass eine Referenz selbst seine Adresse wiedergibt, Unsinn wäre und deshalb sowas in C++ nicht diese Möglichkeit bieten?



  • Eine Referenz ist ein Alias für ein Objekt, warum sollte eine Referenz also selbst addressierbar sein?


Log in to reply