Swfit中Class的大小
我们先看一段代码
class Teacher {
var age: Int = 18
var name: String = "Tom"
}
var person = Teacher()
print("size of Teacher Class: \(class_getInstanceSize(Teacher.self))")
print("size of age: \(MemoryLayout.size(ofValue: person.age))")
print("size of name: \(MemoryLayout.size(ofValue: person.name))")
/*
打印结果
size of Teacher Class: 40
size of age: 8
size of name: 16
*/
很明显,Teacher类在堆中占有40个字节,其中Int占8个,String占16个,那么剩下的16个字节是什么呢?
swift_allocObject函数
通过上一篇文章我们知道,swift中分配类内存空间调用的是这个方法,这个时候我们查看swift的源码,看该方法是如何实现的。
我们在HeapObject.cpp文件中找到该函数的实现,我们设一个断点在方法里面,运行下源码。
我们看到在初始化的时候,进入了
swift_allocObject函数,requiredSize传入的参数是40,说明的确分配了40个字节的空间。
我们继续执行,发现进入了swift_slowAlloc函数
最终执行了
malloc_zone_malloc函数,向堆区间申请了内存空间
HeapObject
我们回头看下swift_allocObject函数,发现申请完的内存空间以HeapObject返回了出去,那HeapObject是什么呢?直接查看源文件
HeapObject是结构体,他含有两个属性:元数据metadata、引用计数refCounts,我们简单的看下HeapMetadata、InlineRefCounts分别是什么
从图中可以发现
HeapMetadata是一个结构体,InlineRefCounts是一个Class类型,这样我们可以知道HeapObject的大小了,metadata是结构体的指针,占8个字节,refCounts是类的引用,也占8个字节,所以HeapObject共16个字节
总结
所以,一个的类中存了除了他本身的属性外,还有一个大小为16字节的HeapObject,HeapObject存放了该类的元数据指针,和引用计数,我们可以读取内存验证下
下次我们深入metadata和引用计数展开。
待续