Linux下C语言——结构体对齐

结构体对齐的步骤:

            1、结构体各成员对齐
            2、整个结构体圆整

结构体对齐的特定对齐值:

            1、自身对齐值: 自身对齐值就是结构体变量里每个成员的自身大小;

            2、指定对齐值: 指定对齐值是由宏#pragma pack (N)指定的值,里面的N必须是2的幂次方,如1,2,4,8,16等。如果没有通过#pragma pack宏那么在32位的Linux主机上默认指定对齐值为4,64位的Linux主机上默认指定对齐值为8,ARM CPU默认指定对齐值为8;

            3、有效对齐值: ① 结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中较小的一个,
                                      ② 结构体圆整时,为所有成员中自身对齐值最大的与指定对齐值较小的一个;

下面举两个简单的例子(32位系统):

typedef struct _st_struct1			typedef struct _st_struct2
{									{
    char       	  a;					short      	  b;
    short         b;					int           c;
    int           c;					char          a;
}st_struct1;						}st_struct2;

        这两个结构体内部的数据类型是相同的,那是不是也意味着这两个结构体所占用的存储空间也是相同的呢?答案是不同的。

        我们先运用上面讲解的流程来对这两个结构体分别进行对齐。首先将确定自身对齐值以及指定对齐值:

  • 自身对齐值:char  1byte、short   2bytes、int  4bytes
  • 指定对齐值:4bytes(指定为32位系统)

下面对结构体st_struct1进行对齐:

Linux下C语言——结构体对齐
下面对结构体st_struct2进行对齐:
Linux下C语言——结构体对齐
        可见虽然含有的数据类型相同,但是结构体st_struct1和结构体st_struct2所占用的存储空间却不同。

        以上就是结构体对齐的简单举例。