Swift 值类型的优化思考

851 阅读1分钟

众所周知,Swift很建议我们使用结构体或者枚举这些值类型,少用类。而且因为常量变量、泛型等一些特性及编译型语言优点,Swift在编译时会有一些优化

  1. 纯粹的结构体和枚举 类型确定,内存大小确定,Swift可以在编译时针对性的做一些 内联优化
  2. 纯粹的值类型 只会存在一个持有者,不会出现循环引用这些问题,苹果也不需要添加引用计数这些额外操作
  3. 结构体 函数派发的时候,可以直接静态派发。类的话因为涉及到继承,需要函数表动态派发
  4. 虽然我个人不知道苹果是否会把一些简单的类优化到在栈上存储,但是结构体一般情况下是会被优化到栈上面存储的,除非这个结构体的生命周期被延长,函数结束还没释放(比如被类持有或者被函数闭合),不过如果这个结构体占用空间太大,则不会被优化到栈上面
  5. 由于值语义的特性,结构体在安全方面表现更出色,不过 两个线程引用了同一个全局的结构体 还是有可能会发生崩溃bug,需要注意。
  6. 如果自定义的结构体里面持有了引用类型,如果想要依旧保持值语义,可以通过isKnownUniquelyReferenced函数 自己实现写时拷贝,来保证值语义。