Swift内存模型的那点事儿

        跟OC类似, Swift提供了MemoryLayout类静态测量对象大小, 注意是在编译时确定的,不是运行时哦! 作为Java程序员想想如何测量Java对象大小? 参考 Java对象到底有多大?

       写这篇博客的目的在于说明2个黑科技:

1、 类/结构体的成员变量声明顺序会影响它的占用空间。 原理是内存对齐, 有经验的码农会把占用空间大的变量写在前面, 占用空间小的写在后面。 PS: 大道同源,C/C++/Object-C/Swift/Java都需要字节对齐; 如果面试时问你内存优化有什么经验? 你告诉他这个一定会另眼相看!!

2、 可以篡改Swift结构体/类对象的私有成员(通过指针操作内存)。 Java要用反射实现。


       为什么要内存对齐呢?简单来说就是CPU寻址更快,详情参见 内存对齐原因

       在不同机型上数据类型占用的空间大小也不同, 例如iPhone5上Int占4个字节, iPhone7上Int占8个字节。 本文是在iPhone7模拟器上验证的。


内存分配:参考 结构体和类的区别

Stack(栈),存储值类型的临时变量,函数调用栈,引用类型的临时变量指针,结构体对象和类对象引用

Heap(堆),存储引用类型的实例,例如类对象


Swift3.0提供了内存操作类MemoryLayout(注意:Swift跟OC一样,内存排列时需要对齐,造成一定的内存浪费,我们称之为内存碎片), 它有3个主要参数:

1、实例方法alignment和静态方法 alignment(ofValue: T):

字节对齐属性,它要求当前数据类型相对于起始位置的偏移必须是alignment的整数倍。 例如在iPhone7上Int占8个字节,那么在类/结构体中Int型参数的起始位置必须是8的整数倍(可认为类/结构体第一个成员变量的内存起始位置为0), 后面会用实例说明。


2、 实例成员变量size和静态方法size(ofValue: T)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值