Je sais que dans C, l'ordre des membres struct est l'ordre dans lequel ils sont déclarés plus (habituellement, sauf indication contraire) un remplissage peut se produire, menant aux deux premières structures que j'ai créées avec leur taille respective:Membres de la structure ordonnant des avantages dans C
struct MyStructV1
{
int a;
char c;
int b;
};
printf("size of MyStructV1 is:%lu \n",sizeof(struct MyStructV1)); // prints 12
struct MyStructV1Packed
{
int a;
char c;
int b;
}__attribute__((__packed__));;
printf("size of MyStructV1Packed is:%lu \n",sizeof(struct MyStructV1Packed)); // prints 9
Jusqu'ici tout va bien.
Ma question est donc de savoir si la déclaration suivante de la version «déballée» de MyStructV2 présente des avantages/avantages par rapport à la première version de MyStructV1?
struct MyStructV2
{
int a;
int b;
char c;
};
printf("size of MyStructV2 is:%lu \n",sizeof(struct MyStructV2)); // prints 12 as well
Notez que maintenant l'ordre des membres a des changements (b est déclaré avant c).
Je fais référence à l'accès mémoire "coûts" ou des cycles doivent être effectués afin de lire/écrire les membres struct et/ou d'autres considérations qui sont pertinentes?
Est-ce dépendant du compilateur/de l'architecture (le cas échéant)?
Cheers,
Guy.
La plupart du temps, il n'a pas d'importance du tout. Vous pourriez vouloir mettre des champs plus larges avant les plus courts. Bien sûr, cela dépend de l'architecture et de l'ABI –
Il dépend beaucoup du compilateur. Une très bonne règle à suivre est de ne pas s'inquiéter des structures d'emballage, sauf si vous avez une raison spécifique de l'architecture et du compilateur pour le faire et savoir exactement ce que c'est. Sinon, il vaut mieux laisser le compilateur le gérer et insérer un octet ou deux de remplissage à sa guise. –