Fount этого утверждение нулевой длиной битового поле может вызвать следующее поле, чтобы быть выровнено по границе следующего контейнера, когда контейнер имеет такой же размер, как основной тип битового поляРазличные типы битовых полей нулевой длины в c?
Для того, чтобы поместить его на практику предполагая, что int - 2 байта (16 бит), и что короткий - 1 байт (8 бит), чтобы сохранить ввод. Также предположим, что мы используем компилятор gcc (было бы неплохо объяснить различия в clang).
struct foo {
unsigned int a:5;
unsigned int :0;
unsigned int b:3;
}
В памяти это выглядит как
struct address
|
|
v
aaaaa000 00000000 bbb00000 00000000
Вопрос 1: В моем понимании это может не выглядеть aaaaa000 00000000 0..00bbb00000...
, так bbb
должен согласовать с контейнером непосредственно после текущего контейнера. Это правда?
Двигаясь дальше, если я указываю
struct bar {
unsigned short x:5;
unsigned int :0;
unsigned short y:7;
}
Будет ли это как так?
struct address
| short stops here short starts
| | |
v v | this is uint | v
xxxxx000 00000000 00000000 yyyyyyy0
Edit 1 Было отмечено, что короткие не может быть меньше, чем 16 байт. Это немного рядом с вопросом в этом вопросе. Но если его важна для вас, вы можете заменить short
с char
и int
с short
Какой компилятор? Битовые поля имеют множество специфических для реализации деталей. –
@CarlNorum отредактировал вопрос. – user10607
Даже битовые поля получают отступы для выравнивания во время переключателей типов, поэтому ваш образец неправильный. –