structure de mémoire des membres de la structure

Si j’ai une structure comme celle-ci:

struct S { ANY_TYPE a; ANY_TYPE b; ANY_TYPE c; } s; 

Puis-je supposer en toute sécurité que les hypothèses suivantes seront toujours valables sur toutes les plateformes?

 ((char *)&s.a) < ((char *)&s.c) ((char *)&s.a + sizeof(sa) + sizeof(sb)) <= ((char *)&s.c) 

En C ++ aussi?

Oui, en C au moins. Le compilateur est libre d’insérer un remplissage après tout membre de la structure, mais il ne doit pas réorganiser les membres.

Il ne doit pas non plus insérer de remplissage avant le premier membre.

À partir de C99, 6.7.2.1 :

13 / Dans un object de structure, les membres autres que les champs de bits et les unités dans lesquelles résident les champs de bits ont des adresses qui augmentent dans l’ordre dans lequel ils ont été déclarés. Un pointeur sur un object de structure, converti de manière appropriée, pointe vers son membre initial (ou si ce membre est un champ de bits, puis vers l’unité dans laquelle il réside), et inversement. Il peut y avoir un remplissage non nommé dans un object de structure, mais pas au début.

15 / Il peut y avoir un remplissage non nommé à la fin d’une structure ou d’une union.

Cela est vrai pour une structure, mais change en C ++ dès que vous introduisez des spécificateurs d’access. Le compilateur est autorisé à réorganiser des blocs entiers délimités par des spécificateurs d’access.

En C ++, vous pouvez être certain que ces hypothèses seront vérifiées. Dans une telle structure, le compilateur n’est pas autorisé à modifier l’ordre des membres.

Oui, par défaut, les compilateurs C ++ ne sont pas autorisés à se déplacer parmi les éléments d’une structure, ce qui rend les deux instructions sortingvialement vraies.

  1. Oui (tant que sizeof (ANY_TYPE) n’est pas égal à 0. Certains compilateurs le permettent, ce qui n’est pas standard – voir Peut sizeof retourner 0 (zéro) ). Vous seriez en sécurité avec <= ou supposeriez simplement un compilateur standard.

  2. Oui

Et en C ++ aussi.

La comparaison de pointeurs n’a de sens que dans les tableaux et les structures / classes, pas généralement.