本文摘自robinh00d http://www.cnblogs.com/robinh00d/archive/2010/03/06/1679675.html
结构体对齐浅析
个人理解,如有误,请指正。
一 结构体内成员的的对齐
成员的地址要按照成员的大小来对齐 比如int 类型的数据的地址要按照sizeof(int)对齐
比如
typedef struct _s
{
char a;
int b;
}s;
sizeof(s) = 8
除了要考虑结构体内成员的地址对齐 还要考虑结构体自身的对齐,原因就是因为当多个结构体成员存在的时候(结构体数组),
如果结构体自身不对齐 会造成数组里的其他结构体内的成员变量地址无法对齐。
二 结构体自身的对齐
1.如果没有明确写上paragma pack(x)结构体自身就按照结构体里最大成员长度对齐
比如
typedef struct _FILE_BASIC_INFORMATION
{
LARGE_INTEGER CreationTime; //8字节
LARGE_INTEGER LastAccessTime; //8字节
LARGE_INTEGER LastWriteTime; //8字节
LARGE_INTEGER ChangeTime; //8字节
USHORT FileAttributes; //4字节
}FILE_BASIC_INFORMATION;
sizeof(FILE_BASIC_INFORMATION) = 40
整个结构体按sizeof(LARGE_INTEGER)对齐
2.如果明确写上paragma pack(x)则又分为两种情况:
a.如果x小于结构体长度最大的成员的长度 则按x对齐
比如
pragma pack(4)
typedef struct _FILE_BASIC_INFORMATION
{
LARGE_INTEGER CreationTime; //8字节
LARGE_INTEGER LastAccessTime; //8字节
LARGE_INTEGER LastWriteTime; //8字节
LARGE_INTEGER ChangeTime; //8字节
USHORT FileAttributes; //4字节
}FILE_BASIC_INFORMATION;
sizeof(FILE_BASIC_INFORMATION) = 36(按4对齐而不是按sizeof(LARGE_INTEGER)
b.如果x大于结构体长度最大的成员的长度 则按结构体里长度最长成员长度对齐
比如
pragma pack(8)
typedef struct _x
{
char a;
short b;
}x;
sizeof(x) = 4 (按sizeof(short)对齐)