Почему размер структуры не совпадает с размером суммы ее элементов?

с помощью функции sizeof пытаюсь определить размер данной структуры:

struct BitMapFileHeader
{
    WORD bfType; // Тип файла (должен быть BM).
    DWORD bfSize; // Размер файла в байтах.
    WORD bfReserved1; 
    WORD bfReserved2; // Зарезервированные поля.
    DWORD bfOffBits; // Смещение битового массива относительно начала файла.
} BMF; 

Получаю значение = 16, почему так? DWORD же, по идее, занимает 4 байта, а WORD - 2.


Ответы (2 шт):

Автор решения: Mark Shevchenko

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

Похожая история с двухбайтовыми значениями, которые должны быть выравнены на границу 2 байта.

Компилятор выравнивает значения в структурах за вас. Предположу (это надо проверить) что 2 «лишних» байта появились после bfType, перед bfSize.

Лишние байты никак не используются, просто ускоряют программу.

Для того, чтобы отключить выравнивание применяют директиву компилятора pragma pack либо директиву __declspec(align):

__declspen(align(1)) struct BitMapFileHeader
{
    WORD bfType; // Тип файла (должен быть BM).
    DWORD bfSize; // Размер файла в байтах.
    WORD bfReserved1; 
    WORD bfReserved2; // Зарезервированные поля.
    DWORD bfOffBits; // Смещение битового массива относительно начала файла.
} BMF; 

align(1) означает выравнивание на границу байта, все значения в структуре будут расположены вплотную друг к другу.

Подробности

→ Ссылка
Автор решения: eri
#pragma pack( push, 1)

Потом структуры с упаковкой. Чтоб вернуться к оптимизированным выравниваниям.

#pragma pack( pop)
→ Ссылка