结构体的对齐

 

本文摘自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)对齐)

原文地址:https://www.cnblogs.com/flash610/p/3075170.html