Rückgabe einer lokalen Variable



  • Hallo,

    Wenn ich dies schreibe:

    struct P { int a = 0; int b = 0; };
    
    const P& getP()
    {
    	P pTest = { 5, 5 };
    	return pTest;
    }
    
    int main()
    {
    	P p = getP();
    }
    

    gibt es eine Warnung wegen
    C4172 returning address of local variable or temporary:pTest

    Nun kann ich entweder auf die const Referenz verzichten

    P getP()
    {
    	P pTest = { 5, 5 };
    	return pTest;
    }
    

    oder ich mache die lokale Variable static

    const P& getP()
    {
    	static P pTest = { 5, 5 };
    	return pTest;
    }
    

    Meine Fragen nun;
    ist hier überhaupt eine const Referenz notwendig?
    da die Warnung ja wohl deswegen kommt, weil die Variable nur in der jeweiligen Funktion existiert und man dies mit dem static ändert(?), wird diese Variable dann bei jedem Aufruf neu erstellt, bis man einen Keller voll mit pTest `s hat?

    PS: es geht jetzt nich um Konstruktoren oder deren Erstellung, sondern nur um die Rückgabe eines komplexen Types.


  • Mod

    Nein, mit static wäre das alles dieselbe Variable. Und da du mit einer Referenz darauf arbeitest, würden sich mehrere Aufrufer diese Variable teilen. Das kann unter gewissen Umständen etwas sein, das man will, um bestimmte Effekte zu erreichen, aber im Allgemeinen ist das ein eher unerwartetes Verhalten. Die Variante 2 ist in aller Regel das, was man will, wenn es darum geht, dass da factory-artig ein komplexes Objekt zusammengebaut wird. Da werden auch keine unnötigen Kopien gemacht, sondern das Objekt würde direkt an der Stelle von p in der main konstruiert werden.



  • Ok, danke.



  • @SeppJ sagte in Rückgabe einer lokalen Variable:

    Da werden auch keine unnötigen Kopien gemacht, sondern das Objekt würde direkt an der Stelle von p in der main konstruiert werden.

    @zeropage Return value optimization


Anmelden zum Antworten