Largeur en bits d'une classe

Dec 06 2020

il y a une classe déclarée comme:

class Payload {
    uint8_t m_a : 1;
    uint8_t m_b : 5;
    uint8_t m_c : 2;
    uint8_t m_d : 4;
};

vous voyez, le sizeof(Payload) == 2. Jusqu'ici tout va bien. Le nombre total de bits est de 12, il dépasse les 8 bits donc 2 octets sont occupés.

Mais y a-t-il un moyen d'obtenir la quantité de bits déclarée par la classe? Je veux revenir '12' ...? Sûr de faire fonctionner l'algorithme pour tout type de champs de bits de définition de classe comme ci-dessus, théoriquement de toute taille ...

Réponses

1 dfrib Dec 06 2020 at 04:16

Non, pas d'une manière conforme aux normes.

[class.bit] / 1 :

l'attribut de champ de bits ne fait pas partie du type du membre de classe

ce qui signifie que ces informations ne peuvent pas être extraites au moment de la compilation. Toute tentative de recherche de ces informations à l'aide de techniques d'introspection à l'exécution reposerait, au mieux, sur un comportement défini par l'implémentation.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. Cela obtient la taille de la structure en octets et la multiplie par le nombre de bits par octet (techniquement, ce n'est pas toujours 8). Cela fonctionne car les structures contenant un champ de bits ne peuvent pas avoir une taille en bits qui n'est pas un multiple de CHAR_BIT. Le compilateur ajoutera des bits de remplissage après le dernier membre.