结构体和类的本质区别
结构体是值类型(枚举也是值类型),类是引用类型(指针类型)
class Size {
var width = 1
var height = 2
}
struct Point {
var x = 3
var y = 4
}
func test() {
var size = Size()
var point = Point()
}
函数调用像size和point这两个变量它的内存在哪里呢,结构体point是值类型特点,值类型是在函数中创建的那么他的内容就在栈空间中,值类型Point中有x,y所以加起来是16个字节,假设内存地址0x10000是point这个变量的起始地址,那么从0x10000开始占用16个字节而且现在一个单元格是8个字节,因为Point是结构体是值类型,所以它在函数中创建的话Point就是再栈空间而且是连续的16个字节的栈空间就是Point这个结构体的内存由于初始化完point结构体的内存地址为0x10000连续的16个字节是point结构体的内存0x10000-0x10008同时0x10000也是point中x的内存地址,0x10008也是y的内存地址,然而size中由于size是类,类的话是引用类型,也就是指针类型,size的本质是指针变量,指针变量在64位环境中占8个字节所以假设size这个指针变量地址,size这个指针变量内存在栈空间,在栈空间中有8个字节是给size做指针变量的内存地址为0x10010,从这个地址开始的8个字节就是指针变量的内存,那么指针变量里面放的是size对象的内存地址,假设size这个指针变量的8个字节假设里面放的是0x90000那么0x90000是真正的size对象的内存地址那么这个对象是在堆空间,堆空间size类占用多大的内存虽然size只有两个成员,但实际上如果要在堆空间分配内存放size对象的话,要分配32个字节,假设在堆空间size这个对象的首地址0x90000那么它的地址值是存储在size变量的内存中的,也就是size是个指针变量它在栈空间占8个字节,这个指针变量存储的地址值就是0x90000就是真正的堆空间size对象的地址.所以栈空间的0x90000指向堆空间的这个size对象,其中前面16个字节其他用处,后面的16个字节存储成员变量.
|
请发表评论