Meskipun standar ANSI C menentukan terlalu sedikit tentang bagaimana bitfields dikemas untuk menawarkan keuntungan yang signifikan atas "kompiler diizinkan untuk mengemas bitfields bagaimanapun mereka mau", namun dalam banyak kasus melarang kompiler untuk mengemas sesuatu dengan cara yang paling efisien.
Secara khusus, jika suatu struktur berisi bitfield, kompiler diperlukan untuk menyimpannya sebagai struktur yang berisi satu atau lebih kolom anonim dari beberapa jenis penyimpanan "normal" dan kemudian secara logis membagi setiap kolom tersebut menjadi bagian bitfield penyusunnya. Jadi, diberikan:
unsigned char foo1: 3;
unsigned char foo2: 3;
unsigned char foo3: 3;
unsigned char foo4: 3;
unsigned char foo5: 3;
unsigned char foo6: 3;
unsigned char foo7: 3;
Jika unsigned char
8 bit, kompilator akan diminta untuk mengalokasikan empat bidang dari jenis itu, dan menetapkan dua bidang bit ke semua kecuali satu (yang akan berada di char
bidangnya sendiri). Jika semua char
deklarasi telah diganti dengan short
, maka akan ada dua field bertipe short
, salah satunya akan menampung lima bitfield dan yang lainnya akan menampung dua sisanya.
Pada prosesor tanpa batasan penyelarasan, data dapat disusun lebih efisien dengan menggunakan unsigned short
untuk lima bidang pertama dan unsigned char
untuk dua terakhir, menyimpan tujuh bidang tiga-bit dalam tiga byte. Meskipun dimungkinkan untuk menyimpan delapan bidang tiga-bit dalam tiga byte, kompilator hanya dapat mengizinkan itu jika ada tipe numerik tiga-byte yang dapat digunakan sebagai tipe "bidang luar".
Secara pribadi, saya menganggap bitfields sebagaimana didefinisikan pada dasarnya tidak berguna. Jika kode perlu bekerja dengan data yang dikemas biner, kode harus secara eksplisit menentukan lokasi penyimpanan dari tipe aktual, dan kemudian menggunakan makro atau cara lain untuk mengakses bitnya. Akan sangat membantu jika C mendukung sintaks seperti:
unsigned short f1;
unsigned char f2;
union foo1 = f1:0.3;
union foo2 = f1:3.3;
union foo3 = f1:6.3;
union foo4 = f1:9.3;
union foo5 = f1:12.3;
union foo6 = f2:0.3;
union foo7 = f2:3.3;
Sintaks seperti itu, jika diizinkan, akan memungkinkan kode untuk menggunakan bitfields secara portabel, tanpa memperhatikan ukuran kata atau urutan byte (foo0 akan berada di tiga bit paling signifikan dari f1, tetapi itu dapat disimpan di alamat yang lebih rendah atau lebih tinggi). Tidak adanya fitur seperti itu, bagaimanapun, makro mungkin satu-satunya cara portabel untuk beroperasi dengan hal-hal seperti itu.