Незважаючи на те, що стандарт ANSI C вказує занадто мало про те, як упаковуються розрядні поля, щоб надати якусь значну перевагу над "компіляторами дозволяється пакувати розрядні поля, як вони вважають за потрібне", тим не менше, у багатьох випадках компіляторам забороняється пакувати речі найбільш ефективно.
Зокрема, якщо структура містить бітові поля, компілятор повинен зберігати її як структуру, яка містить одне або кілька анонімних полів якогось «нормального» типу зберігання, а потім логічно розподіляти кожне таке поле на складові частини бітового поля. Таким чином, враховуючи:
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;
Якщо unsigned char
дорівнює 8 бітам, компілятору потрібно буде виділити чотири поля цього типу та призначити два бітові поля всім, крім одного (яке було б у char
власному полі). Якби всі char
декларації були замінені на short
, тоді було б два поля типу short
, одне з яких містило б п’ять бітових полів, а друге - решта два.
На процесорі без обмежень по вирівнюванню дані можуть бути викладені більш ефективно, використовуючи unsigned short
для перших п’яти полів і unsigned char
для останніх двох, зберігаючи сім трибітових полів у трьох байтах. Хоча мала б бути можливість зберігати вісім трибітових полів у трьох байтах, компілятор міг би дозволити це лише за умови існування трибайтового числового типу, який можна було б використовувати як тип "зовнішнього поля".
Особисто я вважаю, що розрядні поля, як вони визначені, в основному марні. Якщо коду потрібно працювати з двійково упакованими даними, він повинен чітко визначити місця зберігання фактичних типів, а потім використовувати макроси або інші подібні засоби для доступу до їх бітів. Було б корисно, якщо б C підтримував такий синтаксис, як:
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;
Такий синтаксис, якщо він дозволений, дасть можливість коду використовувати бітові поля в портативному режимі, не враховуючи розміри слів або впорядкування байтів (foo0 буде в трьох найменш значущих бітах f1, але вони можуть зберігатися в нижча або вища адреса). Однак за відсутності такої функції макроси є, мабуть, єдиним портативним способом роботи з такими речами.