[Erledigt] C++ Referenz erzwingen



  • Michael E. schrieb:

    http://www.parashift.com/c++-faq-lite/const-correctness.html

    Auf dieser Seite war ich schon heute schon mehrmals. Hier ist es grausam in der Formulierung versteckt. Wenn man vorher nicht wusste dass es sich nur auf den this Pointer bezieht, wird man diese Information in diesem Link nie herausholen können.

    Michael E. schrieb:

    Zweiter Link der Google-Suche: http://en.wikipedia.org/wiki/Const-correctness. Abschnitt 1.3 Methods.

    Dieser Link ist weitaus besser und ohne Umwege formuliert.

    Danke für deine Hilfe.



  • zeusosc schrieb:

    ...
    Der stack von function wird ja wieder frei geräumt (je nach call convention...)

    Hallo Zeusosc, ich kann es gerade nicht einordnen. In wiefern sollte es mir nun mit const memberfunktionen helfen?



  • zeusosc schrieb:

    schon mal mit

    void function ( double & referenz)
    { referenz=get_double(); return;}
    
    //oder
    void function ( double * pointer)
    { *pointer=get_double(); return;}
    

    probiert ??

    Der stack von function wird ja wieder frei geräumt (je nach call convention...)

    Das Beispiel ergibt für mich nicht viel Sinn 😃
    Hier werden keine Referenzen zugewiesen sondern Values. In 1) wird ein bereits exisztierendes Objekt per Referenz an function übergeben, dort wird referenz ein neuer Wert zugewiesen, welcher aus get_double zurückgegeben wurde. Dabei ist es egal, ob dies jetzt per Referenz oder value passiert.
    Selbes gilt übrigens auch für den zweiten Aufruf, nur halt mit Pointern.

    BTW. ist ein "return;" in einer void-Funktion total unnötig, vor allem wenn man eh schon am Ende ist 😃



  • Jo,

    die Anforderung war speicher zu sparen.
    Mit der Annahme das der Aufruf "get_double()" nicht geändert werden kann, gibt es die möglichkeit die Lebenszeit eines im Stack allocierten Types möglichst kurz zu halten. Halt ne psuedo referenz,..

    habe ja nicht gesagt das es sinnig sei 😃



  • darkfate schrieb:

    ...

    Etwas ganz anderes: Breche deine Sätze bitte nicht händisch mit return um, das macht das Forum automatisch am Seitenrand (Und je nach dem wie breit die Seite konkret ist).

    darkfate schrieb:

    Wenn das stimmt dass const in:

    typ get_value() const;
    

    Sich nur auf den this-> Pointer bezieht,...

    this-> Pointer halte ich aber für eine unglücklichere Formulierung als aktuelle Instanz. Ein const am Ende einer Methode besagt, das die Methode den Objektzustand nicht ändert.

    Etwas anderes, wegen dem "die Anforderung war speicher zu sparen." (Ich hatte vorher schon einen Post angefangen, diesen aber scheinbar nicht abgeschickt).

    Auch wenn man Performance nicht gänzlich außer acht lassen sollte, gibt es den schönen (und meiner Meinung sehr passenden Spruch): "premature optimization is the root of all evil". Man sollte nicht um biegen und brechen im Vorfeld versuchen zu optimieren (natürlich sollte man auch nicht bewusst Performancebremsen einbauen) - in 90% der Fälle wird es nicht an der von dir prognostizierten Stelle wirklich eine Verbesserung des Speicher- oder Performanceverhalten geben.

    Um noch genauer zu werden: Viele Compiler werden Temporäre Variablen von Rückgabewerten, wenn möglich, ohnehin wegoptimieren. Im Kommenden Standard wird das ganze noch durch rvalue-Referenzen unterstützt.

    Das beste ist erst einmal sauberen Code zu erzeugen, und dann zu prüfen wo die Performanceengpässe wirklich sind (mit Hilfe eines Profilers), und dann auch nach Möglichkeit nur diese Stellen anzupassen.



  • asc schrieb:

    this-> Pointer halte ich aber für eine unglücklichere Formulierung als aktuelle Instanz. Ein const am Ende einer Methode besagt, das die Methode den Objektzustand nicht ändert.

    Der this pointer bezieht sich doch auf das aktuelle ganze objekt?



  • darkfate schrieb:

    Der this pointer bezieht sich doch auf das aktuelle ganze objekt?

    Ja, aber Objekt oder Instanz sind wohl verbreitetere Bezeichnungen (Ich kenne sogar einen Entwickler der als er this-> das erste mal im Code gesehen hatte, nachfragen musste, wo Dieser herkommt).


Anmelden zum Antworten