c++ packed



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

Dans la RAM adressable sur les octets, cette structure aurait une longueur de 3 octets .... mais dans la mémoire Flash adressable sur deux octets (où réside une variable const), cette structure devrait avoir une longueur d'au moins 4 octets, en raison de problèmes d'alignement.

Cependant, le compilateur ne peut en déduire que, simplement parce que c'est const ici, il est stocké dans une ROM. Beaucoup d'autres choses peuvent empêcher cela, comme mutable , ou vous pouvez simplement placer le const T manière dynamique sur la pile ou le placer manuellement dans la mémoire de tas en RAM ou dans mille autres choses. Vous pouvez également avoir un const T& qui pourrait se trouver à l'un ou l'autre endroit.

Il semble raisonnable de supposer que T et T 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.

Laisse-moi expliquer:

Supposons que votre système dispose de deux types de mémoire: RAM et Flash (en lecture seule). La RAM est adressable sur 8 bits, alors que le Flash n’est adressable que sur 16 bits. Supposons que ce soit T :

struct T
{
  uint8_t x;
  uint16_t y;
};

Dans la RAM adressable sur les octets, cette structure aurait une longueur de 3 octets .... mais dans la mémoire Flash adressable sur deux octets (où réside une variable const ), 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 la taille et l’alignement des types const et non const ?


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

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





sizeof