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
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.
Tags und Links c++ inheritance constructor sizeof