Considérons un MWE:paniers structures tailles et héritage avec différents compilateurs
#include <iostream>
struct A {} __attribute__((packed)) ;
struct B : A { int x; } __attribute__((packed)) ;
struct C : A { B y; } __attribute__((packed)) ;
int main() {
std::cout << "Size of A: " << sizeof(A) << std::endl;
std::cout << "Size of B: " << sizeof(B) << std::endl;
std::cout << "Size of C: " << sizeof(C) << std::endl;
};
Sur Linux j'ai essayé de le compiler et exécuter:
$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
$ g++ ./test.cpp && ./a.out
Size of A: 1
Size of B: 4
Size of C: 5
Quant à A et B tout est clair. Mais qu'en est-il de C? Qu'est-ce qui ajoute 1 octet à la taille de C? De plus, si vous supprimez des relations d'héritage, que ce soit pour B ou C, C devient de taille 4. En utilisant des compilateurs MS (au moins un qui est livré avec VS 2013), j'ai obtenu 1, 4 et 4 tailles. Toute explication et les détails à ce sujet sont appréciés.
Possible copie de [Pourquoi la taille d'une structure empaquetée serait-elle différente sur Linux et Windows lors de l'utilisation de gcc?] (Http://stackoverflow.com/questions/7789668/why-would-the-size-of-a -packed-structure-être-différent-sur-linux-et-windows-quand) – MSD
@saranyadeviM, j'ai vu cette question. À mon avis, il discute des raisons pour lesquelles les structures peuvent être emballées de différentes manières en général (!). Je m'intéresse plus à la façon dont l'héritage affecte les résultats de l'empaquetage et comment exactement l'héritage mélangé avec la composition ajoute 1 octet à la taille d'une structure. Donc, je crois que ma question est plus spécifique. :) – CaptainTrunky