C/C++中struct内存对齐问题

如图所示:

    

思考:这是struct结构的内存对齐问题,结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。其主要有:

1)结构体内部成员对齐
      对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调 整位置,空缺的字节编译器会自动填充也就是padding。如下图所示:

      

   图中st1,第一个为int型,占用4个字节,第二个为char型,其偏移量为4,char所占的字节数为1,则偏移量是其占用字节数的倍数,则仅列其后,第三个为short型,占用字节数为2,前面已有字节为5,不是2的倍数,所以char后面padding一个字节,使得short的其实地址为6,所以对齐后,共占用8个字节。同理可得str2占用12个字节。

注意: 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

由此,可以对结构成员列表重新排列,让那些对于边界对齐要求最严格的成员首先出现,对边界要求最弱的成员最后出现,可以减少内存损失。

2)结构体之间对齐(此并不是考虑结构体内部的对齐,而是一组结构体的对齐,在计算单个结构体占用字节时并不考虑)
      虑整个结构体的对齐需求。ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。实际上要求结构体至少是其中的那个最大的元素大小的整数倍。因为有时候我们使用的是结构体数组,所以结构体的大小还得保证结构体数组中各个结构体满足对齐要求,同时独立的结构体与结构体数组中单个结构体的大小应当是一致的。

对于结构体中的结构体如图所示:

    

此时考虑时还是将st1中拆成各基本类型处理,st1中最宽类型成员的整数倍如果在st2中最大,就作为st2中最宽类型处理。

上述st2占用,4+12(结构体st1)+1+3=20。
3)对于结构体中的指针
    
指针都是占4个字节的。
posted @ 2015-03-29 19:20  momo_Unique  阅读(393)  评论(0编辑  收藏  举报