Das Hinzufügen eines Standardkonstruktors zu einer Basisklasse ändert sizeof () einen abgeleiteten Typ [duplicate]

8

Ich glaube, ich habe ein ziemlich gutes Verständnis von C ++ Interna und Speicherlayouts, aber dieses hier hat mich verblüfft. Ich habe den folgenden Testcode:

%Vor%

Die Ausgabe ist sinnvoll:

  

Foo: 8 Bar: 12

Das ist jedoch der sehr merkwürdige Teil. Wenn ich den einfachen Standardkonstruktor auf Foo () auskommentiere, ändert sich die Größe von (Bar)! Wie kann das Hinzufügen eines Ctor das Speicherlayout dieser Klassen möglicherweise ändern?

  

Foo: 8 Bar: 8

Kompiliert mit gcc-7.2

    
ByteMe95 20.12.2017, 21:29
quelle

1 Antwort

3

GCC folgt dem Itanium-ABI für C ++, wodurch verhindert wird, dass das Tail-Padding eines POD zum Speichern von abgeleiteten Klassen-Datenelementen verwendet wird.

Das Hinzufügen eines vom Benutzer bereitgestellten Konstruktors bedeutet, dass Foo nicht mehr POD ist, sodass diese Einschränkung nicht für Bar gilt.

Siehe diese Frage für weitere Details zum ABI.

    
M.M 20.12.2017, 22:28
quelle