среда, 31 июля 2013 г.

Анонимный нулевой bit-field

Встретил в Си забавную конструкцию:

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.

Комментариев нет:

Отправить комментарий