阅读 1019

探索Swift中Class的大致结构

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,我们简单的看下HeapMetadataInlineRefCounts分别是什么 从图中可以发现HeapMetadata是一个结构体,InlineRefCounts是一个Class类型,这样我们可以知道HeapObject的大小了,metadata是结构体的指针,占8个字节,refCounts是类的引用,也占8个字节,所以HeapObject共16个字节

总结

所以,一个的类中存了除了他本身的属性外,还有一个大小为16字节的HeapObjectHeapObject存放了该类的元数据指针,和引用计数,我们可以读取内存验证下

下次我们深入metadata和引用计数展开。

待续

文章分类
iOS
文章标签