Copy Constructor



  • huhu leute,
    hab eine kurze, knackige Frage.

    #include <iostream>
    using namespace std;
    
    class Foo
    {
        private:
            int i;
    
        public:
            Foo() : i(0)
            {
                cout << endl << "STD" << endl;
            }
    
            Foo(const Foo& ori)
            {
                this->i = ori.i;
                cout << endl << "COPY" << endl;
            }
    
    };
    
    Foo fkt()
    {
        Foo tmp;
        return tmp;
    }
    
    int main()
    {
        /* Warum wird bei der Erzeugung von test kein Copy-Constructor aufgerufen,
             bzw. warum wird hier gar kein Constructor aufgerufen ??
        */
        Foo test = fkt();
    
        system("pause>nul");
        return 0;
    }
    

    danke euch schonmal



  • also der copy-ctor muss nicht aufgerufen werden(die kopier kann der compiler wegoptimieren, wenn du ihm das erlaubst).

    der std-ctor sollte aber zumindest aufgerufen werden...



  • mit wegoptimieren meinst du, bevor der Compiler das lokale Objekt kopiert und dann löscht und dann das kopierte Objekt verwendet,
    kann er gleich das lokale Objekt nehmen und spart sich das kopieren dann?


  • Mod

    unskilled schrieb:

    der std-ctor sollte aber zumindest aufgerufen werden...

    Möglicherweise wurde das Objekt ganz wegoptimiert, weil nichts damit gemacht wird.



  • So in etwa. Wenn so eine Optimierung stattfindet ("copy elision") dann verschmelzen quasi Quell- und Ziel-objekt zu einem. Dein Compiler hat hier scheinbar sogar 2 Kopien wegoptimiert:
    1. Kopie von tmp als return-Wert (NRVO = named return value optimization)
    2. test als Kopie von return-Wert (erlaubt, wenn Quelle ein "rvalue" ist)

    Das funktioniert üblicherweise so, dass die Funktion in Wirklichkeit die Adresse von dem neuen zu erstellenden 'test'-Objekt bekommt. 'tmp' und 'test' wären dann dieselben Objekte.

    Gruß,
    SP



  • joa wenn ich in die fkt() reinspring wird 1x der STD Constructor aufgerufen.
    Beim erzeugen von "test" wird aber nichts auferufen...

    Wenn ich mit "test" danach noch iwelche operationen ausführe ändert das auch nichts.



  • SeppJ schrieb:

    unskilled schrieb:

    der std-ctor sollte aber zumindest aufgerufen werden...

    Möglicherweise wurde das Objekt ganz wegoptimiert, weil nichts damit gemacht wird.

    ich glaube nicht, dass er eine ausgabe wegoptimieren darf...
    beim copy-ctor is das was anderes, weils (imho) ausdrücklich im standard erlaubt ist - aber er darf ja auch nicht eine ausgabe allein einfach wegoptimieren...

    bb



  • ah k thx@Sebastian Pizer,
    das beantwortet meine unwissenheit nun 🙂



  • SeppJ schrieb:

    unskilled schrieb:

    der std-ctor sollte aber zumindest aufgerufen werden...

    Möglicherweise wurde das Objekt ganz wegoptimiert, weil nichts damit gemacht wird.

    Das darf der Compiler nur, wenn dadurch das Verhalten nicht beobachtbar verändert wird. Nebeneffekte spielen bei "copy elision" allerdings keine Rolle. Hier wird dem Compiler das Wegoptimieren explizit erlaubt, auch wenn der copy ctor besondere Nebeneffekte besitzt.


  • Mod

    Sebastian Pizer schrieb:

    Das darf der Compiler gar nicht wegen den Nebeneffekten (Ausgabe von Text). Nebeneffekte spielen bei "copy elision" allerdings keine Rolle. Hier wirde dem Compiler das wegoptimieren explizit erlaubt, auch wenn der copy ctor besondere Nebeneffekte besitzt.

    Gut zu wissen, dass copy elision eine Ausnahme ist. Hatte mich selber schon gewundert wegen der Nebeneffekte, aber die Beschreibung des Threaderstellers klang so, als ob gar nichts passiert wäre.


Log in to reply