Почему это битовое поле имеет размер 4?
Можно ли как-нибудь сделать так, чтобы он имел размер 2 (как очевидно предполагается в приведенном ниже коде), или это невозможно сделать чисто?
struct S
{
unsigned short x : 15;
bool a : 1;
};
int main() { return sizeof(S); }
Это невозможно сделать со стандартным C ++, но можно использовать прагму или атрибут, специфичные для компилятора, для вашей структуры.
в VC ++ это #pragma pack
Также, чтобы получить только размер 2, вы должны сделать это:
#pragma pack(1)
struct s{
unsigned short s1: 15;
unsigned short b1: 1;
};
С #pragma pack
в вашем коде следующим образом:
struct S
{
unsigned short x : 15;
bool a : 1;
};
Гипотетический макет памяти будет:
----------------------
+ 1 | 2 | 3 | 4 | 5 | ..
+ x | a |
+---------------------
Следовательно он занимает 3 байта
изменения bool a
в unsigned short a
Вы получаете это:
-------------------------
+ 1 | 2 | 3 | 4 | 5| ..
+ x |a|
-------------------------
Который занимает всего 2 байта.
Компилятор решает, что, поскольку второе короткое замыкание занимает всего 1 бит, можно просто сжать структуру в 2 байта. Но если используется элемент структуры другого типа (например, bool
в вашей реализации S
) компилятор считает, что, поскольку типы различаются, он не может сжать 1 бит в unsigned short
(потому что он пересекает границу типа — к сожалению, реализация определена). Отсюда вы получаете 3
байты для sizeof()
вместо 2.
Других решений пока нет …