什么时候我的结构太大?

伊卢托夫

我们鼓励在Swift中使用structover class

这是因为

  1. 编译器可以做很多优化
  2. 在堆栈上创建实例比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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章