结构体内存对齐

放上KC老师的总结,如果觉得字多的请直接往下看
在这里插入图片描述
来来来 放上我的代码

struct LGStruct1 {
    double a;       // 8    [0 7]
    char b;         // 1    [8]
    int c;          // 4    (9 10 11 [12 13 14 15]
    short d;        // 2    [16 17] 24
}struct1;

struct LGStruct2 {
    double a;       // 8    [0 7]
    int b;          // 4    [8 9 10 11]
    char c;         // 1    [12]
    short d;        // 2    (13 [14 15] 16
}struct2;

// 家庭作业 : 结构体内存对齐
struct LGStruct3 {
    double a;       // 8 [0 7)
    int b;          // 4 [8 9 10 11]
    char c;         // 1 [12]
    short d;        // 2 (13 [14 15]
    int e;          // 4 [16 17 18 19]
    struct LGStruct1 str; // (20 21 22 [23 ~ 47] 48 是 24的倍数
}struct3;

先让我们对比一下struct1struct2 从里面的子成员来看,如果单单看成员 那我们肯定会觉得 这两个机构体的所占用的内存是一样大的

但是万万没想到 打印的时候 字节是不一样的 这里面问题就出在了b 与c 的类型与顺序上
按照内存对齐原则1

每个数据成员存储的起始位置要
从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,
结构体等)的整数倍开始(⽐如int为4字节,则要从4的整数倍地址开始存

这条来看 在struct1里面 当我们到达b的时候 占用了9字节的内存 这个这个时候 我们看下c是int类型 哦吼 9不是4的倍数 那我们就得空出空间 移到12之后开始

这时候我们在看看struct2 当我们到达b的时候 b是int类型 而a占用了8个字节 8是4的倍数 所以我们的b可以直接接在 a所占的空间后面 到达了c的时候 char 是1字节的 所以 它就不管前面是啥了 可以直接接上

这个时候 我们应该理解了 原则1的概念 (我讲的这么通俗易懂 不懂不怪我哈)

在确定一下
如果我们把c 改为double类型的

struct LGStruct1 {
    double a;       // 8    [0 7]
    char b;         // 1    [8]
    double c;       // 8    (9 10 11 12 13 14 15)[ 16 17 18 19 20 21 22 23]
    short d;        // 2    [24 25] 32
}struct1;

结果答应出来的占用的size为 32 这就说明 就算空7个 也得空出来 至于为什么 占用的字节是32 而不是26 这个时候又涉及到了 内存对齐原则3

3:结构体的总⼤⼩,也就是sizeof的结果,.必须是其内部最⼤
成员的整数倍.不⾜的要补⻬。

因为我们 struct1 里面最大的成员是 double 那我们所需要的内存 就是8个字节的倍数 26字节明显不是 那我们只能使用32字节了

现在我们开始做一下struct3 这个就比较好玩了
struct3中 有一个成员是结构体,这时候我们就要用到了内存对齐原则2

2:结构体作为成员:如果⼀个结构⾥有某些结构体成员,则结构体成员要从
其内部最⼤元素⼤⼩的整数倍地址开始存储

而最后一个成员里面 最大的元素 是 double 当我们到达e的时候时候 字节占用已经达到了20字节 这个时候 以为第二原则的要求 我们就得空到24字节然后 开始存入 占用了48字节

struct3占用了48字节 我就有了个疑问了 因为str 是24字节 而48即是24的倍数 也是8的倍数 那在原则3里 他真的按照了内部最大成员的整倍数来补齐? 那是不是真的好大!!!

struct LGStruct3 {
    double a;       // 8 [0 7)
    int b;          // 4 [8 9 10 11]
    char c;         // 1 [12]
    short d;        // 2 (13 [14 15]
    int e;          // 4 [16 17 18 19]
    struct LGStruct2 str; // (20 21 22 [23 ~ 39] 40
}struct3;

我的天哪
竟然是40
那这样是不是说明 原则3里面的内部最⼤成员的整数倍 指的是基本数据类型
那这样 原则三这句话应该是?(如果总结错误 大佬请指出)

结构体的内存大小必须是结构体中最大基本数据类型成员内存大小的整数倍,不足的需要补齐。

内存对齐原则大概就是这样了
有啥收获 再补充
上篇文章 对不起细小老师
这里在给逻辑教育大波广告 逻辑教育牛逼666

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值