Größe der polymorphen Klasse, die virtuell abgeleitet wurde

8

Ich habe Schwierigkeiten, die Größe der folgenden Klassen zu untermauern, und was macht das aus? Ich benutze MSVS 2008 (VC 9.0 Compiler). Ich habe gelesen, dass, wenn ich keine virtuellen Funktionen deklariere (im folgenden Beispiel), Klasse D 2 zusätzliche Zeiger enthalten wird (1 von B und ein anderer von C), die auf die gemeinsame Instanz von A zeigen.

Aber was wäre die Speicherabbildung der einzelnen Klassen im unteren Fall (mit virtuellen Funktionen auch)?

%Vor%

Ausgabe:
Größe der Klasse A: 8
Größe der Klasse B: 20 ​​
Größe der Klasse C: 20 Stück Größe der Klasse D: 32

Hier, wie die Größe von B, C & amp; D werden berechnet?

BEARBEITEN: Im Folgenden finden Sie die Speicherzuordnung, die von der Compileroption / d1reportSingleClassLayoutXXX für jede Klasse generiert wurde:

%Vor%

Was bedeutet vtordisp für vbase X hier?

    
SuperNov 28.02.2014, 09:34
quelle

2 Antworten

1

Ich würde sagen, dass Sie sich auf einem 32-Bit-Rechner befinden, wobei sizeof(int) 4 ist.

Spekulativ:

Zuerst die Größe von A:

%Vor%

Zweitens, die Größe von B und C:

%Vor%

Drittens, die Größe von D:

%Vor%

Da D nicht virtuell von C erbt, kann es sich leisten, vtable pointer C wiederzuverwenden. Auch das ist nur Spekulation. Sie sollten versuchen, den Speicher eines Objekts D zu sichern, um sicher zu gehen. Und ich bin mir nicht sicher, wie Ihre Maschine Speicher ausrichtet.

    
Laurent LA RIZZA 28.02.2014 09:57
quelle
1

Gemäß Jonathan Höhlen, MSFT

  

Es wird sehr selten verwendet - aber wir müssen es Klassen hinzufügen, die von einer virtuellen Basis erben   virtuelle Funktionen überschreiben und überschreiben, nur für den Fall, dass der Benutzer eine virtuelle Funktion aufruft   der Konstruktor oder Destruktor.

Also - es ist MSVCs (schrecklich unterdokumentierte) Lösung für "wie machen Sie einen virtuellen Aufruf während der Objektkonstruktion?".

    
LThode 15.12.2014 16:00
quelle