了解Swift写时复制机制

在Swift中,我们有引用类型(类)和值类型(结构,元组,枚举)。 值类型具有复制语义。 这意味着,如果您为变量分配值类型或将其作为参数传递给函数(除非它是inout参数),则将复制该值的基础数据。 您将拥有两个具有相同内容的值,但是分配在两个不同的内存地址中。 有关Apple博客上引用类型和值类型之间差异的更详细说明。

由于我们将要讨论写时复制,因此了解Swift值语义非常重要。

所以……开始吧

什么是写时复制?

在Swift中,当您具有较大的值类型并且必须将参数分配或作为参数传递给函数时,就性能而言,将其复制可能会非常昂贵,因为您必须将所有基础数​​据复制到内存中的另一个位置。

为了将问题最小化,Swift Standard库为某些值类型(例如Array)实现了这套机制,其中值仅在发生突变时才复制,即使在该值具有多个引用的情况下也才复制,因为如果该值是唯一引用的,不需要复制,可以在引用上进行更改。 因此,仅分配给变量或将Array传递给函数并不一定意味着它将被复制,并且确实可以提高性能。

真正重要的是要知道的是…

写时复制不是值类型的默认行为,它是在Swift标准库中针对某些类型(例如数组和集合)实施的。 因此,这意味着并非标准库中的每个值类型都具有此行为。 此外,除非您自己实现它,否则您创建的值类型没有它。 这是我将在下一节稍后讨论的内容。

让我们在实践中看一个例子:

这就是本文的全部,希望您喜欢🙂

如果您有任何意见或疑问,请告诉我。 我很高兴收到您的反馈feedback

您可以在Twitter上@ LucianoPassos11找到我。

感谢您阅读🙂