Der C++ - Compiler wird den Standardkopiekonstruktor in der folgenden Situation synthetisieren. (Aus dem C++ - Objektmodell)
- Wenn die Klasse ein Memberobjekt einer Klasse enthält, für die ein Kopierkonstruktor existiert.
- Wenn die Klasse von einer Basisklasse abgeleitet ist, für die ein Kopierkonstruktor existiert.
- Wenn die Klasse eine oder mehrere virtuelle Funktionen deklariert
- Wenn die Klasse von einer Vererbungskette abgeleitet ist, in der eine oder mehrere Basisklassen virtuell sind.
Wir können sehen, die Klasse A ist nicht in den 4 Situationen. Also cl nicht den Standard-Copy-Konstruktor dafür synthetisieren. Vielleicht deshalb 2 Temp A-Objekte konstruiert und zerstört.
Aus dem Disassmly-Fenster können wir den folgenden Code sehen, kein A :: A genannt.:
B b;
00B317F8 lea ecx,[b]
00B317FB call B::B (0B31650h)
00B31800 mov dword ptr [ebp-4],0
func(b);
00B31807 mov al,byte ptr [ebp-12h]
00B3180A mov byte ptr [ebp-13h],al
00B3180D mov byte ptr [ebp-4],1
00B31811 movzx ecx,byte ptr [ebp-13h]
00B31815 push ecx
00B31816 call func (0B31730h)
Aber wenn wir den Destruktor virtuell machen. Wir werden den folgenden Zerlegungscode bekommen, wir können sehen, dass der A :: A aufgerufen wird. Dann ist das Ergebnis wie erwartet, nur 1 Ein Objekt erstellt.
B b;
00331898 lea ecx,[b]
0033189B call B::B (03316A0h)
003318A0 mov dword ptr [ebp-4],0
func(b);
003318A7 push ecx
003318A8 mov ecx,esp
003318AA mov dword ptr [ebp-1Ch],esp
003318AD lea eax,[b]
003318B0 push eax
003318B1 call A::A (0331900h)
003318B6 mov dword ptr [ebp-20h],eax
003318B9 call func (03317D0h)
es auf VS2010 getestet, ist das Ergebnis „132242“ – Apokal
Clang 4.1 produziert „13242“ –
VS Release-Version nur 13242 produzieren, aber nicht Debug-Version – billz