Встретил в Си забавную конструкцию:
Здесь присутствует очень забавная вещь - анонимное битовое поле нулевого размера. После преодоления шока от увиденного полез разбираться.
Оказывается это вполне осмысленная конструкция, наверное её даже кто-то применяет.
Что это такое рассказывает раздел
В переводе:
Поясню на примере:
Как мы видим, по сумма размеров членов обоих типов совпадает, но
struct A
{
int :0;
};
Здесь присутствует очень забавная вещь - анонимное битовое поле нулевого размера. После преодоления шока от увиденного полез разбираться.
Оказывается это вполне осмысленная конструкция, наверное её даже кто-то применяет.
Что это такое рассказывает раздел
6.7.2.1 Structure and union specifiers
12. A bit-field declaration with no declarator, but only a colon and a width, indicates an unnamed bit-field126). As a special case, a bit-field structure member with a width of 0 indicates that no further bit-field is to be packed into the unit in which the previous bit-field, if any, was placed.
126) An unnamed bit-field structure member is useful for padding to conform to externally imposed layouts.
В переводе:
12. Битовое поле без объявления, а только с двоеточием и шириной означает безымянное битовое поле 126). Отдельный случай когда член структуры - битовое поле с нулевой шириной означает, что дальнейшие битовые поля не будут упакованы в область, в которую упакованы предыдущие битовые поля.
126) Безымянные битовые поля полезны для заполнения пришедших из вне структур объектов.
Поясню на примере:
#include <stdio.h>
typedef struct
{
unsigned int a : 1, b : 1;
} A;
typedef struct
{
unsigned int a : 1, : 0, b : 1;
} B;
int main()
{
printf("%lu %lu\n", sizeof(A), sizeof(B) );
return 0;
}
$ gcc test.c && ./a.out
4 8
Как мы видим, по сумма размеров членов обоих типов совпадает, но
sizeof
выдаёт нам разные размеры.В первом случае всё нормально - оба bit-field'а упаковались в одно слово и размер структуры был 4. Во втором мы упаковали в разные слова и получили размер 8.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.