Rembourrage de la structure de données

Qu’est-ce que le remplissage de la structure de données en c ++ et comment puis-je vérifier le nombre d’octets multipliés?

class a { public: int x; int y; int z; }; 

Les processeurs exigent que certains types de données aient des alignements particuliers. Par exemple, un processeur peut nécessiter qu’un int soit sur une limite de 4 octets. Ainsi, par exemple, un int peut démarrer à l’emplacement de mémoire 0x4000 mais ne peut pas démarrer à 0x4001 . Donc si vous avez défini une classe:

 class a { public: char c; int i; }; 

le compilateur devrait insérer un remplissage entre c et i pour que i puisse commencer sur une limite de 4 octets.

 struct A { char c; int i; }; int main(int argc, char *argv[]) { A a; cout << "sizeof struct = " << sizeof(A) << endl; cout << "sizeof items = " << sizeof(ac) + sizeof(ai) << endl; return 0; } 

le remplissage est effectué pour des raisons de performances – voir cet article Alignement de la structure de données pour plus d’informations.

Pour voir si le compilateur garnit votre structure de données, vous pouvez écrire un programme simple:

 #include  class a { public: int x; int y; int z; }; int main() { std::cout << sizeof(a) << std::endl; // print the total size in bytes required per class instance a anInstance; std::cout << &anInstance.x << std::endl; // print the address of the x member std::cout << &anInstance.y << std::endl; // as above but for y std::cout << &anInstance.z << std::endl; // etc } 

J'ai ajouté la déclaration publique pour éviter les erreurs de compilation - Cela n'affectera pas la taille ni le remplissage.

Edit: Exécuter ceci sur mon macbook air donne la sortie suivante: 12 0x7fff5fbff650 0x7fff5fbff654 0x7fff5fbff658

Cela montre que sur ma machine, la taille totale est de 12 octets et que chaque membre est séparé de 4 octets. Les ints sont de 4 octets chacun (ce qui peut être confirmé avec sizeof (int)). Il n'y a pas de rembourrage.

Essayez ceci avec différents membres de votre classe, par exemple:

 class b { public: char w; char x[6]; int y; long long z; }; 

Lol suffit de créer 2 structs identiques, en faire un emballé par exemple

 struct foo { int a; char b; int c; } struct bar { int a; char b; int c; } __atsortingbute__((__packed__)); 

sizeof(foo) - sizeof(bar) vous donnera la quantité de rembourrage. Ou vous pouvez aussi calculer manuellement comme suggéré par Duck.