数据结构对齐规则(C语言)

概念:

一些概念是为了容易理解,自己定义的。

1、基本对齐系数:

        默认情况:由编译器和操作系统决定,一般来说32位系统对齐系数为4(字节);64位系统对齐系数为8(字节)

        自定义情况:通过#pragma pack(n) 定义

2、最大类型字节数:数据结构的所有基本类型成员中,所占字节数最多的成员的字节长度;如

typedef struct {
    char ch_a;
    int  int_b;   
} T1;

图一

最大类型字节数为4(int int_b)

3、结构体对齐系数:结构体本身的大小必须是某个数的整数倍,这个数就是结构体的对齐系数

规则:

1、数据结构内部成员对齐位置:

1-1:如果成员是基本类型,它一定是该成员字节长度的整数倍;如图1中,int_b成员的位置是4(它的长度是4,正好是1倍)

1-2:如果成员也是一个数据结构,它一定是其内部数据结构中“最大类型字节数”的整数倍

typedef struct {
    char t1_ch_a;
    int  t1_int_b;   
} T1;

typedef struct {
    char t2_ch_a;
    T1 t2_t1;
} T2;

因为t2_t1是一个数据结构,其内部"最大类型字节数"为4,则t2_t1在T2结构体中对齐位置为4(最大类型字节数的整数倍)

规则2:

结构体的对齐系数=MIN(基本对齐系数,最大类型字节数)

按照以上概念和规则,就可以得出数据结构的sizeof;在64位系统中的例子如下:

例子1:

typedef struct {
    char a;    // a宽度为1,起始位置为0
    char b;    // b宽度为1,起始位置为1
    char c;    // c宽度为1,起始位置为2
} T1;

结构体的对齐系数=MIN(8,1)=1; 故sizeof(T1)=3

例子2:

typedef struct {
    short int a;    // a宽度为2,起始位置为0
    T1 t1;          // t1最大类型字节数为1,起始位置为2
}T2;

结构体的最大类型字节数为2(short int a),结构体的对齐系数=MIN(8,2)=2;故sizeof(T2) = 2+3+1=6 (最后一个1就是为了满足结构体的对齐系数而填充的)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值