汇编窥探Swift底层(三):结构体和类

窥探结构体和类的内存

    1. 首先先看这样一段代码,定义了一个类Size和一个结构体Point并初始化,然后打印了一下对象的地址和内存,方便窥探一下结构体和类对象究竟在内存中怎么存放的
class Size{
    let width = 3
    let height = 4
}
var size = Size()

print("size变量的地址=",Mems.ptr(ofVal: &size)) 
打印之后是:size变量的地址= 0x0000000100008390

print("size变量的内存=",Mems.memStr(ofVal: &size)) 
打印之后是:size变量的内存= 0x00000001007090a0


struct Point{
    let x = 6
    let y = 7
}
var point = Point()

print("point变量的地址=",Mems.ptr(ofVal: &point)) 
打印之后是:point变量的地址= 0x0000000100008398

print("point变量的内存=",Mems.memStr(ofVal: &point)) 
打印之后是:point变量的内存= 0x0000000000000006 0x0000000000000007

    1. 观察上面的打印结果,由于结构体是值类型,数据存放在栈空间,所以point变量的内存中直接就存储了我们初始化的6、7,没有问题;而size变量的内存中存储的是一段指针0x00000001007090a0,我们利用View Memroy工具,去内存中看看这个指针究竟存储的是什么
    1. 下图就是指针0x00000001007090a0的内存,由于这里是小端模式,我们读取的时候要倒着读取,我们可以从内存中看出,前16个字节非常奇怪,我们的数据3、4在后面16个字节中,我可以告诉大家,这里的前8个字节指向了类型信息,往后8个字节是与引用计数相关,剩下的才是我们的数据。
      0x00000001007090a0的内存.png
    1. 我画了一张图来表述一下,上述代码的内存


      最开始那段代码的内存布局
    1. 总结:
    • 结构体对象是值类型,数据一般存放在栈空间
    • 类对象是引用类型,在栈空间存放着堆空间的地址,堆空间的前16个字节存放类型信息和引用计数,后面才是我们存储的数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。