Разница в размерах одинаковых структур

108
15 октября 2019, 07:40

Решил написать класс для манипуляции BMP изображениями. Поскольку мне не нравится стиль WinAPI кода решил переопределить структуры BITMAPFILEHEADER и BITMAPINFOHEADER, но столкнулся со странной проблемой: размер переопределённой структуры больше размера WinAPI-структуры.
Код:

WinAPI:

typedef unsigned short      WORD;
typedef unsigned long       DWORD;
// ...
typedef struct tagBITMAPFILEHEADER {
    WORD    bfType;
    DWORD   bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

Мой код:

using Byte = unsigned char;
using Word = unsigned short;
using Dword = unsigned long;
// ...
struct FileHeader {
    Word    type = 0x4D42;
    Dword   size;
    Word    reserved1 = 0;                  
    Word    reserved2 = 0;
    Dword   offsetBits;
};

Суть проблемы:

size_t winApi = sizeof(BITMAPFILEHEADER); // = 14
size_t my     = sizeof(FileHeader);       // = 16

Не могу понять почему размеры различаются.

Answer 1

Вероятно, используемое вашим компилятором выравнивание по умолчанию приводит к таким фокусам. Укажите явно выравнивание хотя бы на 2 байта, а не на 4.

В VC++ примерно так:

#pragma pack(push,1)
... СТРУКТУРА
#pragma pack(pop)
READ ALSO
Как влиять на время отправки датаграммы

Как влиять на время отправки датаграммы

Есть qudpsocketЕсть два массива байт

103
Как работать с TUN на с++ [закрыт]

Как работать с TUN на с++ [закрыт]

Как работать с tun на с++ и обрабатывать пакеты +Можете ли скинуть какой-нить материал по TUN

99
Корреляционный код в С++

Корреляционный код в С++

Есть задача, с бинарной системы исчисления провести корреляцию, то есть с 1001 должно выйти 10010110Каждая единица это 10, а ноль это 01

91
Удаление указателя в слоте при связи destroyed()

Удаление указателя в слоте при связи destroyed()

У меня есть участок кода, который в определённых случаях генерирует ошибку, которую мне никак не удаётся понятьСвязана она с освобождением...

131