探索Swift中Class的大致结构

探索Swift中Class的大致结构

IOS小彩虹2021-08-17 17:38:34280A+A-

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和引用计数展开。

待续

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们