Как плотно упаковать структуру в Windows? - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь создать упакованную структуру, которая представляет заголовок определенного пакета данных.Из-за этого у него не должно быть отступов, соответствующих размеру, указанному в спецификации.Однако в Windows он будет заполнен 1 байтом после последнего поля, независимо от того, как я скажу компилятору плотно упаковать структуру.

Я пробовал этот код в Compiler Explorer и на большинстве платформЯ получаю желаемый результат, кроме MSVC.Я также попробовал подсистему Windows для Linux (WSL) с GCC, которая снова дает мне правильный результат.У меня только проблемы с заполнением в Windows.

Упрощенная версия структуры выглядит следующим образом:

typedef struct
{
    unsigned a : 10;
    unsigned b : 1;
    unsigned c : 5;
    unsigned d : 8;
} __attribute__((packed)) A;

Использование MSVC:

#pragma pack(push, 1)
typedef struct
{
    unsigned a : 10;
    unsigned b : 1;
    unsigned c : 5;
    unsigned d : 8;
} A;
#pragma pack(pop)

В случае MSVC Iтакже попытался добавить параметр компилятора / Zp1 по умолчанию для выравнивания в 1 байт.

Я ожидаю, что размер структуры составит 3 байта.В Linux с gcc или clang это нормально, но в Windows с MinGW GCC или MSVC размер всегда составляет 4 байта.

1 Ответ

2 голосов
/ 16 июня 2019

Если вы измените типы на:

#pragma pack(push, 1)
typedef struct
{
    unsigned short a : 10;
    unsigned short b : 1;
    unsigned short c : 5;
    unsigned char d : 8;
} A;
#pragma pack(pop)

Тогда получается 3 байта.

Вы также можете эмулировать битовые поля вручную, чтобы минимизировать такие неожиданности.

...