2021-06-09

iOS 内存对齐

先研究类对象以及对象中包含的属性、函数、成员变量在内存中是如何存储的。
首先了解数据类型在内存中占用的字节:

创建一个类 YPerson 继承于NSObject 添加属性如图:
在主程序中创建此类的对象并对属性进行赋值:
打印结果:
得出的结果表示 指针所占内存大小为8字节,对象理论需要的内存为40个字节 实际分配的内存为48个字节 。
从实际运行结果看 对象理论上需要的内存是40个字节,但实际上系统却分配了48个字节。说明在实际运行过程中分配内存并不是完全按照需要多少分配多少的原则执行。按照同样的流程分别增加属性、成员变量、函数,创建、赋值与打印操作不变可得到以下内容
①增加属性:

②增加成员变量:

③增加函数:

④ 没有属性

⑤只有一个int类型:

从这几种情况来看增加属性与成员变量都会导致内存变化,但是函数却不会。并且理论需要的内存永远是8的倍数,实际分配的内存永远是16的倍数。

临时结论:
1.在对象中指针默认使用内存为8字节
2.对象中成员变量与属性都会影响对象所占内存空间大小,但函数不会。
3.对象所需要的内存永远是8字节的整数倍,实际开辟的内存永远都是16字节的整数倍。

现在我们再来了解一下结构体的内存。

从上述测试结果中可以知道软件是有内存对齐处理的,那么内存对齐的原则是什么呢? 我自己肯定是不知道的,附上专业版的:

1、数据成员对齐规则:结构体或者联合体的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储)。通俗来讲就是除了第一个位置,后面的每个成员存放的位置起始位置都要存放的那个成员(如果有子成员那就是子成员)的整数倍位置。
2、结构体作为成员:如果一个结构体里面有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。
3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

验证:
创建结构体 理论数据:
打印结果:

将结构体添加到类中按照之前打印对象的方式打印



打印对象内存信息:
在这里插入图片描述

结论:
1.结构体存储对齐方式为结构体内部最大元素的整数倍(结构体嵌套结构体时按照按照结构体与子结构中最大的那个元素算)
2.类对象内部属性与成员变量与结构体存储排列方式相同,但类对象默认使用8字节对齐方式。
3.类中的函数不影响对象内存所占空间。
4.类对象在实际存储中默认按照16字节进行对齐,不足则补位。
5.占位较小的属性后面有空位时默认会将空位补充到前面。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值