跟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)