美文网首页swift开发知识收集
汇编窥探Swift底层(三):结构体和类

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

作者: 冰风v落叶 | 来源:发表于2020-02-26 12:59 被阅读0次

    窥探结构体和类的内存

      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个字节存放类型信息和引用计数,后面才是我们存储的数据

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/boitchtx.html