Для приведенной ниже структуры фактический (без заполнения) размер структуры равен 54. На 64-битной (Windows 7) машине с MinGW (GCC) 4.8.1 x86_64 я получаю sizeof(BMPHeader)
как 56, что понятно. Согласно требованиям формата файла BMP, структура не должна иметь отступов. Есть три варианта (в порядке приоритета):
- C++11's
alignas(1)
struct __attribute__ ((packed)) BMPHeader
#pragma pack(1)
Однако последний вариант (с наименьшим приоритетом), кажется, работает, давая мне 54. Это ошибка в компиляторе, или я что-то здесь ошибся? SSCCE
#include <iostream>
struct alignas(1) BMPHeader
{
// BMP header
uint16_t magic;
uint32_t fileSize;
uint32_t reserved;
uint32_t dataOffset;
// DIB header
uint32_t dibHeaderLength;
uint32_t width;
uint32_t height;
uint16_t numColourPlanes;
uint16_t bitsPerPixels;
uint32_t biBitFields;
uint32_t dataSize;
uint32_t physicalWidth;
uint32_t physicalHeight;
uint32_t numPaletteColours;
uint32_t numImportantColours;
};
int main()
{
std::cout << sizeof(BMPHeader) << std::endl;
}
alignas(1)
не работает. При этом вы не можете требовать выравнивания менее строгого, чем естественное выравнивание. - person R. Martinho Fernandes   schedule 22.11.2013