Смещение в структуре с битовыми полями

Если у нас есть структура с битовыми полями, то как выровнять последующие элементы в структуре? Рассмотрим следующий код:

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-м) байте.

Что происходит во втором случае? Каково правило для заполнения в структурах, включающих битовые поля в целом?

3

Решение

как выровнять последующие элементы в структуре?

Никто не знает. Это поведение, определяемое реализацией и, следовательно, зависящее от компилятора.

Что происходит во втором случае?

Компилятор может добавить байты заполнения или биты заполнения. Или порядок битов структуры может отличаться от ожидаемого. Первый элемент структуры не обязательно содержит MSB.

Каково правило для заполнения в структурах, включающих битовые поля в целом?

Компилятор может добавлять любые байты заполнения (и биты заполнения в поле битов) в любом месте структуры, если это не сделано в самом начале структуры.

Битовые поля очень плохо определены стандартом. Они практически бесполезны для чего-то еще, кроме кусков логических флагов, размещенных в случайных местах в памяти. Я бы посоветовал вам использовать побитовые операторы на простых целых числах. Тогда вы получите 100% детерминированный, переносимый код.

2

Другие решения

Я бы взял небольшой пример. Надеюсь, это прояснит:
Рассмотрим две структуры:

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

Спасибо

Некоторые ссылки ::

Структура данных Alignment-wikipedia

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector