Sobre la eficiencia, no creo que debas preocuparte. En los distintos procesadores que he utilizado, el código generado por bitfields suele ser casi el mismo que utilizarías con bitmasks y operaciones binarias. Digo casi, porque esto es dependiente del compilador, y en algunos casos, el código generado por bitfields era mediocre. La única ventaja que veo en utilizarlos, es que te permite expresar algunas operaciones que de otra manera resultarían un poco complicadas con operaciones binarias.
Por hacer un ejemplo rápido:
Código:
//con bitfields
struct{
unsigned a:3;
signed b:4;
unsigned c:1;
}abc;
abc.b = -7;
abc.b = ~abc.b;
//sin bitfields
unsigned char abc;
abc = (-7 << 3) & 0x78;
abc = ~abc | (abc & ~0x78);