对于下面的结构体,在没有填充的情况下,结构体的实际大小为54。在64位(Windows 7)机器上使用MinGW(GCC)4.8.1 x86_64时,我得到了
sizeof(BMPHeader)
结果为56,这是可以理解的。根据BMP文件格式的要求,结构体不应有填充。我有三个选项(按优先级排序):
- C++11的
alignas(1)
struct __attribute__ ((packed)) BMPHeader
#pragma pack(1)
#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)
无效。这意味着你不能请求比自然对齐更松散的对齐方式。 - R. Martinho Fernandes