内存对齐是由编译器完成的。所以不存在怎么做到内存对齐。
但程序员必须理解内存对齐,否则可能会遇到无法预料的问题。
比如,BMP文件头部有14个字节用描述图片,为此定义了下面的结构体
typedef struct
{
u16 bfType ; //文件标志.只对'BM'用来识别BMP位图类型
u32 bfSize ; //文件大小占四个字节
u16 bfReserved1 ;//保留
u16 bfReserved2 ;//保留
u32 bfOffBits ; //从文件开始到位图数据(bitmap data)开始之间的的偏移量
}BITMAPFILEHEADER ;
如果忽视了内存对齐,直接从BMP文件头部连续读17个字节到结构体里。可能正常,也可能出错。
当编译器采用16位对齐时,是正常的。采用32位对齐时,在bfType和bfSize之间会插入两个字节的空间,导致读入的内容错位。
理解了内存对齐后,就知道需要避免这种情况。比如加个关键词,通知编译器不要对齐
typedef __packed struct
{
u16 bfType ; //文件标志.只对'BM'用来识别BMP位图类型
u32 bfSize ; //文件大小占四个字节
u16 bfReserved1 ;//保留
u16 bfReserved2 ;//保留
u32 bfOffBits ; //从文件开始到位图数据(bitmap data)开始之间的的偏移量
}BITMAPFILEHEADER ;