J'ai une structure contenant un champ de bits, dont la taille peut varier. Exemple:Champs de bits de taille variable avec aliasing
struct BitfieldSmallBase {
uint8_t a:2;
uint8_t b:3;
....
}
struct BitfieldLargeBase {
uint8_t a:4;
uint8_t b:5;
....
}
et un syndicat d'accéder à tous les bits à la fois:
template<typename T>
union Bitfield
{
T bits;
uint8_t all; // <------------- Here is the problem
bool operator & (Bitfield<T> x) const {
return !!(all & x.all);
}
Bitfield<T> operator + (Bitfield<T> x) const {
Bitfield<T> temp;
temp.all = all + x.all; //works, because I can assume no overflow will happen
return temp;
}
....
}
typedef Bitfield<BitfieldSmallBase> BitfieldSmall;
typedef Bitfield<BitfieldLargeBase> BitfieldLarge;
Le problème est le suivant: Pour certaines classes de base BITFIELD, un uint8_t ne suffit pas. BitfieldSmall s'intègre dans un uint8_t, mais pas BitfieldLarge. Les données doivent être emballées aussi étroitement que possible (elles seront traitées par des instructions SSE plus tard), donc toujours utiliser uint16_t est hors de question. Existe-t-il un moyen de déclarer le champ "all" avec un type intégral, dont la taille est la même que celle du bitfield? Ou une autre façon d'accéder à des bits dans leur ensemble?
Je peux bien sûr renoncer à l'utilisation du modèle et déclarer explicitement toutes les sortes de champs de bits, mais je voudrais éviter la répétition de code (il y a une liste assez complète d'opérateurs et de fonctions membres).
Parfois, la solution est si simple :-) – hirschhornsalz