36 votes

Est-ce que sizeof(T) == sizeof(const T) et alignof(T) == alignof(const T) ?

Il semble raisonnable de supposer que T y const T seraient deux types qui auraient la même taille et le même alignement, mais après avoir réfléchi à certains systèmes réels, il semble qu'ils pourraient être différents.

Laissez-moi vous expliquer :

Supposons que vous ayez un système avec deux types de mémoire : RAM et Flash (qui est en lecture seule). La RAM est adressable sur 8 bits, tandis que la Flash n'est adressable que sur 16 bits. Supposons que T :

struct T
{
  uint8_t x;
  uint16_t y;
};

Dans la RAM adressable par octet, cette structure aurait une longueur de 3 octets.... mais dans la Flash adressable par double octet (qui est l'endroit où un const résiderait), cette structure devrait avoir une longueur d'au moins 4 octets, en raison de problèmes d'alignement.

Voici donc ma question :

Les normes c et c++ garantissent-elles les tailles et l'alignement des const et non const types ?

33voto

Sam Varshavchik Points 2563

Section 3.9.3 :

Les versions cv-qualifiées ou cv-unifiées d'un type sont des types distincts. distincts ; cependant, ils doivent avoir les mêmes exigences de représentation et d'alignement (3.11). et d'alignement (3.11). 53

"cv-qualified" fait ici référence à const y volatile . La réponse est donc oui.

const y volatile spécifient uniquement les limitations/attributs d'accès à l'objet spécifié. Ils ne sont pas considérés comme faisant partie du type de base lui-même ; ils ne peuvent donc pas affecter les propriétés du type.

31voto

user657267 Points 5796

Oui, ceci est garanti par [basic.type.qualifier] / 1

Les versions cv-qualifiées ou cv-unifiées d'un type sont des types distincts ; cependant, ils ont les mêmes exigences de représentation et d'alignement (3.11).

3voto

Puppy Points 90818

Dans la RAM adressable par octet, cette structure aurait une longueur de 3 octets.... mais dans la Flash adressable sur deux octets (qui est l'endroit où une variable constante résiderait), cette structure devrait avoir une longueur d'au moins 4 octets, à cause de problèmes d'alignement.

Cependant, le compilateur ne peut pas déduire que juste parce que c'est const ici, il est stocké dans la ROM. Il y a beaucoup d'autres choses qui peuvent empêcher ça, comme mutable ou vous pouvez simplement placer dynamiquement le const T sur la pile ou le placer manuellement dans la mémoire de tas de la RAM ou un millier d'autres choses. Vous pouvez également avoir un const T& qui pourrait être à n'importe quel endroit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X