Swift~汇编分析结构体、类的内存布局

2020-06-13  本文已影响0人  水中的蓝天

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

结构体

Swift标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很少一部分,比如:Bool、Int、Double、String、Array、Dictionary等常见类型都是结构体


结构体定义
struct Date {
var year: Int
var month: Int
var day: Int
}

使用(利用初始化器初始化Date)   ,可以传入所有成员值,用以初始化所有成员(存储属性或Stored Property)
var date =  Date(year: 2020, month: 5, day: 18 )

结构体的初始化器

生成多个初始化器.png

思考:下面代码能编译通过吗 ?

struct Point {

var x:Int?
var y:Int?

}

var p1 = Point(x:10,y:10)
var p2 = Point(y:10)
var p3 = Point(x:10)
var p4 = Point()

可以编译通过,可选项都有一个默认值nil; 因此可以编译通过

自定义初始化器


struct Point {

var x:Int?
var y:Int?

  //自定义初始化器
   init(x:Int, y:Int){
       self.x = x
       self.y = y
   }

}

var p1 = Point(x:10,y:10)
var p2 = Point(y:10)
var p3 = Point(x:10)
var p4 = Point()

窥探初始化器的本质

下面两段代码是完全等效的


struct Point {

var x:Int
var y:Int

  //自定义初始化器
   init(){
       x = 0
       y = 0
   }

}

---------------------------------------------

struct Point {
var x:Int = 0
var y:Int = 0
}

结构体的内存结构

示例.png

x和y各占8个字节,Bool占一个字节;内存对齐是8的倍数;所以最终Point占24字节

示例.png

类的初始化器


class Point {

var x:Int
var y:Int

  //自定义初始化器
   init(){
       x = 0
       y = 0
   }

}

---------------------------------------------

class Point {
var x:Int = 0
var y:Int = 0
}

结构体和类的本质区别

示例.png

对象的对空间申请过程

Swift中创建类.png

函数被定义在类的内部和在外部,都是向栈空间申请内存 !唯一的区别就是作用域不同

示例.png

值类型

值类型分析.png
var s1 = "逍遥侯"
var s2 = s1
s2.append("~泰牛了")
print(s1)  //输出结果:逍遥侯
print(s2)  //输出结果:逍遥侯~泰牛了

引用类型

引用类型示例.png

注意:全局变量的内存地址是唯一的

上一篇 下一篇

猜你喜欢

热点阅读