Wertesemantik vs. Referenzsemantik: Speicherort



  • Hallo an Alle!
    Ich lese gerade das Buch "Der C++ Programmierer" und bin mittlerweile auf Seite 588 beim Thema "Performance, Werte- und Referenzsemantik" angelangt. Das Buch liest sich sehr gut und es ist alles sehr gut beschrieben.
    Auf dieser Seite wird eine Tabelle gezeigt, die Werte- und Referenzsemantik gegenüberstellt:

    Unterschied bezüglich:	| Wertesemantik	| Referenzsemantik
    ------------------------|---------------|----------------
    	=		            | kopiert Objekt| kopiert Referenz
    ------------------------|---------------|----------------
    Speicherort für Objekte | Stack		    | Heap
    ------------------------|---------------|----------------
    //usw
    

    Nun stellen sich eine Frage:
    Warum steht da nur Heap? Ich kann doch auch Referenzen anwenden, wenn das Objekt auf dem Stack liegt:

    foo( int& a ) {++a;}
    int a = 5;
    foo( 5 );
    

    Versteh ich da was falsch?
    Vielen Dank schonmal 🙂



  • Vielleicht ist da Referenzsemantik wie in Java gemeint, wo die Objekte dynamisch angelegt werden.

    Wie du sagst, kann man in C++ für einen Zeiger oder eine Referenz nicht bestimmen, wo das referenzierte Objekt abgespeichert ist.



  • Danke Nexus für deine Antwort. Habe das mit Java gegoogelt und wenn das so gemeint ist, dann habe ich das auch verstanden.
    Danke nochmal. 👍



  • Zagatho_zero87 schrieb:

    Unterschied bezüglich:	| Wertesemantik	| Referenzsemantik
    ------------------------|---------------|----------------
    	=		            | kopiert Objekt| kopiert Referenz
    ------------------------|---------------|----------------
    Speicherort für Objekte | Stack		    | Heap
    ------------------------|---------------|----------------
    //usw
    

    Nun stellen sich eine Frage:
    Warum steht da nur Heap? Ich kann doch auch Referenzen anwenden, wenn das Objekt auf dem Stack liegt:

    foo( int& a ) {++a;}
    int a = 5;
    foo( 5 );
    

    Versteh ich da was falsch?
    Vielen Dank schonmal 🙂

    Ich hab mir die Seite eben angeschaut (bei mir Seite 576). Die Tabelle ist echt verwirrend. Und die Erklärung dazu auch. Unter Referenzsemantik versteht er, wenn der Zugriff auf ein Objekt via Verweis erfolgt, wobei das Objekt via new erzeugt wird. Aber was ist nun mit Objekten, die im automatischen Speicher abgelegt werden? Dazu schreibt er nichts... Aber ich glaube, ich weiß worauf er hinaus will. Ein wenig Später sagt er was zu Containern. Wenn du ein Objekt im Container ablegst, wir eine Kopie gemacht. Legst du ein Zeiger im Container ab, anstatt das eigentliche Objekt, ist das natürlich billiger. Legst du einen Zeiger auf eine lokale Variable im Container ab, darfst du den Container natürlich nur im selben Scope benutzen, ansonten ist der Verweis auf die Variable ja ungültig. Er geht wohl davon aus, dass ein Container in verschiedenen Gültigkeitsbereichen benutzt wird, dementsprechend muss das Objekt mit new erzeugt werden... Ich denke, darum bezieht er sich bei Referenzsemantik nur auf den Heap. Aber irgendwie schon verwirrend, darum sag ich mal noch ein paar andere Dinge:

    1. Ein Objekt liegt entweder im
    - Automatischer Speicher
    - Freispeicher
    - Statischen Speicher
    Der Automatische Speicher ist meist als Stack implementiert. Das muss aber nicht so sein! Der Freispeicher ist meist als Heap implementiert. Das muss aber auch nicht so sein!

    2. Eine Referenz ist kein Objekt. Also kann eine Referenz auch nicht kopiert werden. Eine Referenz ist schlicht und einfach ein Aliasname für ein Objekt. Sprich du kannst für ein Objekt mehrere Namen vergeben.

    3. Ich würde bei C++ nicht von Wert- und Referenzsemantik reden. Einfach aus dem Grund, weil ein Zeiger keine Referenz ist.



  • Die beste Erklärung die mir gerade dazu einfällt: Von einem Typ, der darauf ausgelegt ist, dass seine Instanzen direkt als Werte in Ausdrücken* verwendet werden (z.B. int) sagt man, er habe "Wertsemantik". Instanzen von Typen, die z.B. polymorph verwendet werden, werden dagegen in der Regel über eine Indirektion (Pointer, Referenz) angesprochen, solche Typen haben "Referenzsemantik".

    Ich würd mir über die Tabelle nicht zu sehr den Kopf zerbrechen. Auch wenn nicht ganz falsch ist, was da steht, würd ich sagen, dass Wertsemantik vs. Referenzsemantik und der Speicherort der entsprechenden Objekte eigentlich unabhängig voneinander sind. Was du von der ganzen Sache mitnehmen solltest ist einfach, dass C++ einem die Möglichkeit offen lässt, selbst zu entscheiden, wo Objekte direkt und wo sie indirekt herumgereicht werden. Viele andere Sprachen bietem dem Programmierer diese eigentlich essentielle Freiheit leider nicht und viele Umsteiger aus solchen Sprachen haben anfangs Probleme, richtig mit solcher Freiheit umzugehen; prominentestes Symptom davon ist, dass der ganze Code mit new , das man in gutem C++ praktisch nie sieht, nur so gepflastert ist...

    * Ja, ich weiß dass das als strenge Definition nicht standhalten würde, aber ich denk für hier reichts.


Anmelden zum Antworten