我们鼓励在Swift中使用struct
over class
。
这是因为
malloc
/free
调用性能更高struct
变量的缺点是每次从函数返回或分配给函数时都会复制它们。显然,这也可能成为瓶颈。
例如,假设一个4x4矩阵。每次分配/返回时都必须复制16个浮点值,在64位系统上为1'024位。
一种避免这种情况的方法是inout
在将变量传递给函数时使用,这基本上是Swifts创建指针的方法。但随后我们也不鼓励使用inout
。
所以我的问题是:
我应该如何在Swift中处理大型,不变的数据结构?
我是否需要担心struct
与许多成员创建大型会员?
如果是,我什么时候过线?
这个公认的答案不能完全回答您的问题:Swift总是复制结构。Array / Dictionary / String / etc的技巧是它们只是类的包装(包含实际存储的属性)。这样,sizeof(Array)就是指向该类(MemoryLayout<Array<String>>.stride == MemoryLayout<UnsafeRawPointer>.stride
)的指针的大小
如果您有一个非常大的结构,则可能需要考虑将其存储的属性包装在一个类中,以有效地作为参数传递,并isUniquelyReferenced
在进行突变以提供COW语义之前进行检查。
结构还有其他效率优势:它们不需要引用计数,并且可以被优化器分解。
在Swift中,值保留其数据的唯一副本。使用值类型有很多优点,例如确保值具有独立的状态。当我们复制值(赋值,初始化和参数传递的效果)时,程序将创建该值的新副本。对于某些较大的值,这些副本可能很耗时,并且会损害程序的性能。
https://github.com/apple/swift/blob/master/docs/OptimizationTips.rst#the-cost-of-large-swift-values
还有关于容器类型的部分:
请记住,在使用大值类型和使用引用类型之间需要权衡。在某些情况下,复制和移动大价值类型的开销将超过消除桥接和保留/释放开销的成本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句