内存对齐,三个示例教会

引言:

        在网上找内存对齐的文章,说的太抽像了,于是自己写了测试用例得出了一下的结论。我均在vs里面测试过了。

建议先看例子,再来看文字叙述,可以先看示例三的内存图示

做法:找到类内部内存占用最大的作为每一次申请的大小,比如类内部最大为double 那么应该以8为单位申请,

具体做法:

内存对齐可以想象为预先给到你这么多的内存空间,即使你用不到。下一次有属性的添加时看看是否内存超限,超限就再次申请整数倍的内存。

申请的内存数按照最大的一次一次申请,每次申请的都是最大的整数倍,如果内存没有超出,就不用申请。但是此时要注意如果在以8为单位申请时内部有4和1相邻的时候要按照4来申请,具体的看示例2,同理可得16内部申请8...等来套娃

简单示例

    char b;//8
    int c;//8
    char j;//16
    double a;//24

看懂就可以划走了

下图均为在class 里面定义,class就不写了,关键看过程 
//示例1 最大的内存为4
 int a;
 char b;
 //此时为8个字节 但是后三个字节没有写入内容 
 int c;
 //此时为12 因为5+4=9超出了之前分配好的内存8
 char d;
 //此时为16 
 char e;
 //此时为16  因为之前的为12+1有效内存在13处,现在应该在14处,没有超出预先分配好的内存
 char f ;//15
 //16
 char g; //16
 //16
 char j;
 //此时为20,因为这里应该为17超出16,那么这里应该分配int大小
 ...
 ​
 //示例2
 现在换一下,结果如下,最大的内存为8
 ​
 double a;//8
 char b;//16
 int c;//16
 //看这里,到这里时候就说明了在8内部申请以4个单位来对齐
 char d;//24
 char e;//24
 char f;//24
 char g;//24
 char j;//24
 int h;//32
 char i;//32
 char o;//32
 int l;//40
 //示例三 最大的还是为8不管定义在哪个位置
 现在把double a定义在最后面,类的内存分布见图
     
 char b;//8
 int c;//8
 char d;//16
 char e;//16
 char f;//16
 char g;//16
 char j;//16
 int h;//24
 char i;//24
 char o;//24
 int l;//32
 double a;//40
 ​示例三的图示见最后
示例三的内存图示如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值