为何嵌套持有结构体元组的结构体编译耗时远高于类实现?
原因说明
该编译耗时差异核心来源于Swift编译器对*值类型(结构体)和引用类型(类)的处理逻辑差异,具体可以分为三点:
- 内存布局计算成本差异:结构体是值类型,所有存储属性的内容会直接嵌入自身的内存空间,编译器需要递归计算每一层嵌套结构体的内存大小、对齐规则、内存占用边界。示例中的四层嵌套每层10个元素,最终Demo4的内存布局要覆盖10000个Foo实例的空间,计算量随嵌套层数指数上升。而类是引用类型,属性存储的只是指向堆实例的指针,编译器只需要确认指针类型合法即可,不需要递归计算堆上实例的完整内存布局,计算成本大幅降低。
- 类型推断与常量折叠成本差异:值类型的默认初始化常量会触发编译器的常量折叠逻辑,编译器需要在编译期完成所有嵌套值的求值、校验,确认常量值合法可以直接嵌入二进制。而类的初始化是运行时行为,编译期只需要校验初始化表达式的类型合法性,不需要完成全量的实例求值,耗时自然更短。
- 自动生成初始化器的成本差异:没有自定义初始化器的结构体,Swift会自动生成成员逐一初始化的初始化器,生成过程需要递归校验所有嵌套属性的默认值合法性、可访问性;而类不会自动生成成员逐一初始化器,仅会生成默认无参初始化器,不需要额外做这部分递归校验。
另外Xcode 13对应的Swift 5.5版本,对深层嵌套值类型元组的类型推断存在已知性能缺陷,会重复执行多次类型校验逻辑,进一步放大了两者的耗时差距。
内容的提问来源于stack exchange,提问作者user9015472
相关产品推荐
相关产品推荐

