Sasume>
non, au contraire, c'est plutôt nettement plus délicat pour un compilo d'optimiser "bitfield.machin=1, bitfield.truc=0" en "bitfield.value = MACHIN"...
sans compter que c'est relativement fréquent que tous les champs d'un bitfield ne soient pas utiles au même moment, ce qui veut dire que
typedef struct {
char is_a_file:1; // est-ce un fichier ou un répertoire ?
char is_a_program:1; // est-ce un programme ?
char is_a_picture:1; // est-ce une image ?
char is_collapsed:1; // est-ce que le répertoire est replié ?
} ItemType;
void set_itemtype(int type) {
itemtype.is_a_file=1;
itemtype.is_a_program=0;
itemtype.is_a_picture=0;
if (i->type==PICTURE)
itemtype.is_a_picture=1;
else if (type==PROGRAM)
itemtype.is_a_program=1;
}
ne pourra pas être hyper bien optimisé, puisque certains champs ('is_collapsed' en l'occurrence) n'ont une signification que quand on parle d'un répertoire et pas d'un fichier. Mais le compilateur ne le sait pas, donc il doit impérativement se souvenir de l'ancienne valeur de 'is_collapsed' et la restaurer telle quelle...
Donc, dans le meilleur des cas, ça sera transformé en interne en un truc du genre de
void set_itemtype(int type) {
itemtype.value = itemtype.value&~(MASK_PROGRAM|MASK_PICTURE) | MASK_FILE;
if (i->type==PICTURE)
itemtype.value |= MASK_PICTURE;
else if (type==PROGRAM)
itemtype.value |= MASK_PROGRAM;
}
alors que si on avait utilisé des masques directement on aurait pu faire
void set_itemtype(int type) {
if (i->type==PICTURE)
itemtype = MASK_FILE|MASK_PICTURE;
else if (type==PROGRAM)
itemtype = MASK_FILE|MASK_PROGRAM;
else
itemtype = MASK_FILE;
}
qui est très nettement plus efficace...
Et perso je trouve que la dernière formulation est plutôt plus lisible et compacte ^^
A part ça, je ne vois pas vraiment ce que tu pourrais faire comme optimisation sur les bitfields que tu ne pourrais pas faire avec les masques
