Referenz zurueckgeben



  • Hi,

    ich habe mal eine Frage zur Rueckgabe von Referenzen. Sind folgende zwei Funktionen semantisch aequivalent? Und welche ist effizienter? Eigentlich doch die zweite, weil bei der ersten zwei HugeObjects im Speicher existieren. Oder kann der Compiler die erste Variante so optimieren, das es genauso effizient wie die Zweite ist?

    HugeObject test() {
      HugeObject ret;
      return ret;
    }
    
    HugeObject& test() {
      static HugeObject ret;
      return ret;
    }
    

    Viele Gruesse,
    Kip2



  • Nein, die Funktionen unterscheiden sich semantisch.

    Bei der ersten wird bei jedem Aufruf ein lokales Objekt erstellt, das dann für den Rückgabetyp kopiert wird. Vom Compiler kann das eventuell optimiert werden.

    Bei der zweiten Funktion wird wegen static nur beim ersten Aufruf ein Objekt erstellt, das bis zum Programmende existiert. Ab da wird dann immer das gleiche Objekt zurückgegeben.



  • Hi,
    was der Compiler optimieren kann weiß ich nicht, aber vom Kode an sich ist letzterer schneller, da hier nur eine 4 Byte große Addresse zurückgegeben wird.

    Aus obigem code wird im Regefall ein Kopierconstruktor aufgerufen, ist auch eher unwarscheinlich, dass der compiler daran etwas optimiert richtung pointer bzw. referenz.

    Gruß,
    Andy



  • Nexus schrieb:

    Nein, die Funktionen unterscheiden sich semantisch.

    Bei der ersten wird bei jedem Aufruf ein lokales Objekt erstellt, das dann für den Rückgabetyp kopiert wird. Vom Compiler kann das eventuell optimiert werden.

    Bei der zweiten Funktion wird wegen static nur beim ersten Aufruf ein Objekt erstellt, das bis zum Programmende existiert. Ab da wird dann immer das gleiche Objekt zurückgegeben.

    Dazu kommt, dass die zweite Funktion problematisch sein kann, wenn der Benutzer nicht weiß, dass sich alle Aufrufe auf das selbe statische Objekt beziehen.

    Die erste Methode ist die schönere. Und den zweiten Fall braucht man eigentlich auch nicht, wenn man auf Objekten arbeitet. Eventuell mal für eine Singleton.


Anmelden zum Antworten