窥探结构体和类的内存
- 首先先看这样一段代码,定义了一个类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
- 观察上面的打印结果,由于结构体是值类型,数据存放在栈空间,所以
point变量
的内存中直接就存储了我们初始化的6、7,没有问题;而size变量
的内存中存储的是一段指针0x00000001007090a0
,我们利用View Memroy工具,去内存中看看这个指针究竟存储的是什么
- 观察上面的打印结果,由于结构体是值类型,数据存放在栈空间,所以
- 下图就是指针
0x00000001007090a0
的内存,由于这里是小端模式,我们读取的时候要倒着读取,我们可以从内存中看出,前16个字节非常奇怪,我们的数据3、4在后面16个字节中,我可以告诉大家,这里的前8个字节指向了类型信息,往后8个字节是与引用计数相关,剩下的才是我们的数据。
0x00000001007090a0的内存.png
- 下图就是指针
-
我画了一张图来表述一下,上述代码的内存
最开始那段代码的内存布局
-
-
- 总结:
-
结构体对象是值类型,数据一般存放在栈空间
-
类对象是引用类型,在栈空间存放着堆空间的地址,堆空间的前16个字节存放类型信息和引用计数,后面才是我们存储的数据
网友评论