Смещение в структуре с битовыми полями
Если у нас есть структура с битовыми полями, то как выровнять последующие элементы в структуре? Рассмотрим следующий код:
struct A{
int a:1;
char b; // at offset 1
};
struct B{
int a:16;
int b: 17;
char c; // at offset 7
};
printf("Size of A: %d\n", (int)sizeof(struct A));
printf("Offset of b in A: %d\n", (int)offsetof(struct A, b));
printf("Size of B: %d\n", (int)sizeof(struct B));
printf("Offset of c in B: %d\n", (int)offsetof(struct B, c));
Выход:
Size of A: 4
Offset of b in A: 1
Size of B: 8
Offset of c in B: 7
Здесь, в первом случае, b
выделяется только во 2-м байте структуры без заполнения. Но во 2-м случае, когда битовые поля переполняются на 4 байта, c
выделяется в последнем (8-м) байте.
Что происходит во втором случае? Каково правило для заполнения в структурах, включающих битовые поля в целом?
2 ответа
как выровнять последующие элементы в структуре?
Никто не знает. Это поведение, определяемое реализацией и, следовательно, зависящее от компилятора.
Что происходит во втором случае?
Компилятор может добавить байты заполнения или биты заполнения. Или порядок битов структуры может отличаться от ожидаемого. Первый элемент структуры не обязательно содержит MSB.
Каково правило для заполнения в структурах, включающих битовые поля в целом?
Компилятор может добавлять любые байты заполнения (и биты заполнения в поле битов) в любом месте структуры, если это не сделано в самом начале структуры.
Битовые поля очень плохо определены стандартом. По сути, они бесполезны для чего-то еще, кроме кусков логических флагов, размещенных в случайных местах в памяти. Я бы посоветовал вам использовать побитовые операторы вместо простых целых чисел. Тогда вы получите 100% детерминированный, переносимый код.
Я бы взял небольшой пример. Надеюсь, это прояснится:: Рассмотрим две структуры:
struct {
char a;
int b;
char c;
} X;
Против.
struct {
char a;
char b;
int c;
} Y;
Немного больше объяснения относительно комментариев ниже:
Все нижеприведенное не является 100%, а является общим способом построения структур в 32-битной системе, где int 32-битный:
Структура X:
| | | | | | | | | | | | |
char pad pad pad ---------int---------- char pad pad pad = 12 bytes
структура Y:
| | | | | | | | |
char char pad pad ---------int---------- = 8 bytes
Спасибо
Некоторые ссылки::