Referenz als Rückgabewert



  • WebFritzi schrieb:

    3. Es wird ein int r auf dem Stack reserviert und mit dem Wert 2 gefüllt
    4. Der Wert von r wird zu g rüberkopiert, so dass g mit 2 gefüllt wird
    5. Der Speicher, den r belegte, wird wieder freigegeben

    Nein, eigentlich wird beim return zunächst ein temporäres Objekt erzeugt (als Kopie von r), dann wird r zerstört, und dann wird r (bzw. das temporäre Objekt) an g zugewiesen. Diese Erzeugung des temporären Objekts per Kopierkonstruktor kann mittels der schon angesprochenen Named Return Value Optimization (NRVO) vermieden werden. Was das ist, siehe Hume's FAQ: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Optimize#Answ

    Edit: Aber du arbeitest hier mit int-Objekten, die werden auch ganz gerne mal in Registern (%eax) zurückgegeben, da ist diese NRVO-Geschichte nicht wirklich von Belang 😉

    Zweite Frage: Was bedeutet const am Ende einer Funktionsdeklaration?

    CString CString::ToUpper() const;
    

    Das bedeutet, dass ToUpper die Membervariablen seines CString-Objektes nicht verändern kann. Das erlaubt es, diese Methode auch auf const-Objekte aufzurufen. Siehe dein Lieblings-C++-Lehrbuch (vom Level her gehören die beiden Fragen eigentlich nicht annähernd in denselben Thread :þ )



  • Nein, eigentlich wird beim return zunächst ein temporäres Objekt erzeugt (als Kopie von r), dann wird r zerstört, und dann wird r (bzw. das temporäre Objekt) an g zugewiesen

    OK ich habe einen Stack. Da sind schon irgendwelche Werte drauf, die mich jetzt nicht interessieren. Dann werfe ich r drauf. Darauf lege ich ein temporäres Objekt. Jetzt habe ich ein Problem: Wie bekomme ich r vom Stack "gepopt", ohne vorher das temporäre objekt zu "popen".



  • Der Platz für den Rückgabewert wird schon vor dem Aufruf der Funktion freigemacht. Dh r liegt über dem temp-Objekt, und kann dann ganz normal runtergepoppt werden.



  • Ah, OK.


Anmelden zum Antworten