Почему размер структуры не совпадает с размером суммы ее элементов?
с помощью функции sizeof пытаюсь определить размер данной структуры:
struct BitMapFileHeader
{
WORD bfType; // Тип файла (должен быть BM).
DWORD bfSize; // Размер файла в байтах.
WORD bfReserved1;
WORD bfReserved2; // Зарезервированные поля.
DWORD bfOffBits; // Смещение битового массива относительно начала файла.
} BMF;
Получаю значение = 16, почему так? DWORD же, по идее, занимает 4 байта, а WORD - 2.
Ответы (2 шт):
Проблема в так называемом выравнивании. Память устроена так, что быстрее всего четырёхбайтовые значения загружаются в регистры, если адрес их первого байта делится на 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) означает выравнивание на границу байта, все значения в структуре будут расположены вплотную друг к другу.
#pragma pack( push, 1)
Потом структуры с упаковкой. Чтоб вернуться к оптимизированным выравниваниям.
#pragma pack( pop)