结构体内存地址对齐的理解

关键点:

1、结构体第一个成员的地址在offset为0的地方开始

2、第一个成员后面的成员以offset为基点开始地址偏移

3、结构体成员相对于offset偏移的地址是自己大小的整数倍

4、在最后一个成员处,如果该处偏移offset的地址不是所有成员中最大成员的整数倍,就在后面补齐

5、如果成员是结构体或者数组,先计算该结构体大小,再按照成员的规则偏移

 

计算对齐的思路(牢记上面的关键点):

1、从第一个成员开始,offset=0

2、根据第二个成员大小,计算出整数倍的地址(在offset的基础上计算)

3、第三个也是如此(按照第二个)

4、最后一个成员地址计算和上面一样,可是,计算出来的最终地址还要和成员中最大的那个比较,在本成员后面增加地址,使得结构体大小是最大成员的整数倍

 

例子-1:

//大小为16
struct  easy_struct{
    char ch_1;        //[0]
    int  int_4;       //[4]->[7]
    float float_4;    //[8]->[11]
    char ch_2;        //[12]+[13]
    short sh_2;       //[14]->[15]
};

例子-2:

//大小为48
struct str_struct{
    int int_1_4;    //[0]->[3]
    short sh_1_2;   //[4]->[5]
    int int_2_4;    //[8]->[11]
    char ch_1;      //[12]->[15]
    double db_8;    //[16]->[23]
    struct easy_struct es_str;//[24]->[39]
    char ch_2;      //[40]->[41]
    short sh_2_2;   //[42]->[48]
};

参考的文章(写得非常好):https://blog.csdn.net/hairetz/article/details/4084088

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值