Swift 类与结构体的区别

  1. 类有继承,结构体没有继承,也就没有重写、多态等特性
  2. 类的汇编代码比结构体多且复杂,所以,结构体的运行效率要比类快一点。


    Swift 类与结构体的区别_第1张图片
    结构体Person代码

    (1)如图中代码person实例调用speak方法处打断点
    (2)Debug -> DebugWorkflow -> Always Show Disassembly,此设置为断点调试时总显示汇编
    (3)运行代码,进入下图汇编


    Swift 类与结构体的区别_第2张图片
    结构体Person汇编代码

    绿色框内表示调用(callq)一段内存地址,其实这个内存地址就是函数地址,棕色框内分号表示注释,可以看出,这句汇编代码的意思就是 person 实例调用speak() 方法。
    简单直观,方法地址是一串十六进制数,是固定的,因为不存在继承,就不存在重写之类的,编译后,方法地址就是固定明确的。

    对比类的多态,父类实例指向子类,实例调用方法,可能调用父类方法,也可能调用子类方法,这个方法地址就不能固定了。
    现在,我们将结构体变为类:


    Swift 类与结构体的区别_第3张图片
Swift 类与结构体的区别_第4张图片
类的汇编

如图所示,我们将类型从结构体修改为类类型后,编译的汇编代码多了很多很多,如图中右侧红色框内的滚动条,可以看出汇编代码多了多少。
红色箭头上方的汇编代码就是调用方法,可以看出方法地址是不确定的,因为类的话,将来可能是继承的,这样的话,方法是调用父类的呢?还是调用子类的呢?地址就不能是死的,必须是活的。

结构体的汇编代码比类的汇编代码少得多,运行效率高不少,这也就是为什么苹果官方更加推荐开发者使用结构体的原因吧。
所以,一些明确的类,结构简单,就只放些属性和方法,没有继承啥的,建议使用结构体代替类

你可能感兴趣的:(Swift 类与结构体的区别)