Запросы на упаковку запрашивают, чтобы компилятор упаковывал элементы в структуры без заполнения. Однако они не меняют типы или представления самих членов. Похоже, G CC и Clang используют три байта для представления битового поля из 17 битов, а Microsoft использует четыре, по крайней мере, когда базовый тип равен uint32_t
. Таким образом, для этой структуры Clang и G CC упаковывают однобайтовый объект, четырехбайтовый объект и трехбайтовый объект в восемь байтов, в то время как Microsoft упаковывает однобайтовый объект, четырехбайтовый объект, и четырехбайтовый объект на девять байтов.
Это может быть связано с тем фактом, что компилятор Microsoft в основном является компилятором C ++, а C и C ++ по-разному обрабатывают типы битовых полей . В C тип битового поля может быть определен реализацией (стандарт не совсем понятен). В C ++ типом битового поля является его базовый тип.
Мы можем проверить это, рассмотрев переупорядоченную распакованную структуру:
struct S
{
uint8_t f0;
uint32_t f2 : 17;
uint32_t f1;
};
G CC и Clang show sizeof(struct S)
должно быть восемь байтов, что согласуется с трехбайтовым представлением для битового поля. MSV C показывает двенадцать байтов, что соответствует четырехбайтовому представлению для битового поля.