Анонимный нулевой 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 

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 выдаёт нам разные размеры. В первом случае всё нормально - оба битовых поля упаковались в одно слово и размер структуры был 4. Во втором мы упаковали в разные слова и получили размер 8.