Swift 编程的普遍共识(截至 2018 年 5 月,Swift 4.1,Xcode 9.3)是结构应该是首选,除非您的逻辑明确要求对对象的共享引用。
众所周知,结构的一个问题是它们是按值传递的,因此当您将结构传递给函数或从函数返回时,会产生副本。如果您有一个大型结构(例如其中包含 12 个属性),那么这种复制可能会变得昂贵。
这通常被人们辩护说 swift 编译器和/或 LLVM 可以删除副本(即传递对结构的引用,而不是复制它)并且只需要在您实际改变结构时进行复制。
这一切都很好,但总是用理论术语来谈论——“作为一种优化,LLVM可以省略副本”之类的东西。
我的问题是,谁能告诉我们实际发生了什么?编译器实际上是否删除了副本,或者它只是将来可能存在的理论上的优化?(例如,C# 编译器理论上也可以省略结构副本,但它实际上从未这样做过,Microsoft 建议您不要将结构用于大于 16 字节的内容 [1])
如果 swift 确实省略了 struct 副本,是否有一些解释或启发式来说明它是否以及何时这样做?
注意:我说的是用户定义的结构,而不是像数组和字典这样的 stdlib 内置的东西
[1] https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/choosing-between-class-and-struct