面试题答案
一键面试性能差异
- 结构体:
- 结构体是值类型。在处理大规模数据集合时,当传递结构体实例时,会进行值拷贝。如果数据量较大,拷贝操作可能会带来一定的性能开销。不过,由于结构体通常存储在栈上(小结构体),访问速度相对较快,且内存管理简单,不需要引用计数等额外开销。
- 类:
- 类是引用类型。传递类实例时,只是传递引用,不会拷贝整个实例,在大规模数据集合传递时,这方面性能较好。但是,类实例存储在堆上,访问时需要通过指针间接访问,相对栈上访问会慢一些。同时,类使用引用计数进行内存管理,在大规模数据集合频繁创建和销毁类实例时,引用计数的维护会带来额外性能开销。
优先选择结构体的场景
- 数据较小且独立:例如表示一个简单的坐标点
struct Point { var x: Int; var y: Int }
。这种情况下结构体拷贝开销小,且简单的数据结构在栈上存储和访问效率高。 - 性能敏感的算法核心:如一些数值计算的底层算法,结构体不需要引用计数等额外开销,可提高性能。因为在这些场景下,数据的快速访问和简单的内存管理更为重要。
优先选择类的场景
- 需要继承和多态:比如构建一个游戏角色的继承体系,有一个基类
Character
,然后子类Warrior
、Mage
等继承自它。类的继承和多态特性在这种场景下能很好地组织代码结构。 - 数据共享:当多个部分需要共享同一份数据时,使用类更合适。例如多个视图控制器需要访问和修改同一个用户数据模型,使用类可以通过引用共享数据,而结构体的话每个视图控制器都有一份拷贝,不利于数据同步。