`
paddy.w
  • 浏览: 497674 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

结构体的大小——结构体对齐问题

    博客分类:
  • C
 
阅读更多
        C语言中,基本数据类型与操作系统有关(虽然直接与编译器相关),基本没有什么变化。比如在32位操作系统中,int占4个字节,long占4个字节,char占1个字节,double占8个字节。但是结构体的大小并不只与操作系统有关了,与编译器有比较大的关系。
        不同的编译器有不同的对齐方式,下面以32为linux下gcc4.6为例,分析一下gcc中结构体对齐的问题。

        C中可以使用#pragma pack(n)来手动设定对齐数值。gcc默认是4,即按照4字节对齐。一般有如下的对齐规则:
        1、结构体的第一个数据成员的相对位置为0,后续数据成员按n指定的值和该数据成员自身大小中较小的那个进行对齐。
        2、不仅需要数据成员对齐,结构体本身也需要对齐。按照n的值和结构体数据成员中最长的长度中较小的进行对齐。结构体本身对齐即结构体最终的大小须是对齐数值的倍数,且不小于所有数据成员对齐之后的和。
        对齐也即意味着数据的相对地址开始值须是对齐数值的倍数。
struct test {
    int i;//4
    char c;//1
    long l;//4
    double d;//8
}

        i占4字节,c占1字节,l占4字节,d占8字节,使用默认对齐数值4。按照第一条规则,对于i,4=n,按4对齐,则i占据[0,3];对于c,1<n,按1对齐,则c占据[4];对于l,4=n,按4对齐,则l占据[8-11];对于d,8>n,按n=4对齐,则d占据[12-19]。至此数据成员对齐完毕,占据了[0-19]共20个字节。
        接着按照规则2进行结构体本身的对齐。结构体数据成员中最大的是d,占了8个字节,n默认为4,故按照最小值4进行对齐。12是4的倍数,且最接近数据成员大小之和。故此结构体最终的大小是20。
        #pragma pack(n)中n的值之可能是1、2、4。可以用3试一下,编译器回报错。如果用8,编译器不会报错,但是按照规则计算的大小与实际的大小不一致,因为gcc又按照默认的4进行对齐了,可以测试一下,这里不再赘述。
        n=1,n=2的情况与n=4的情况类似,按照规则对齐即可,略。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics