Largeur en bits d'une classe
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
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.
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.