Swift 中的值类型自动引用计数如何工作?

Kri*_*s2k 3 automatic-ref-counting swift swift5

我了解到 Swift 使用自动引用计数(ARC)进行内存管理。我想知道structSwift 中的值类型 () 是如何工作的。

Ita*_*ber 6

来自ARC 上的 Swift 语言指南

\n
\n

引用计数仅适用于类的实例。结构体和枚举是值类型,而不是引用类型,并且通过引用存储和传递。

\n
\n

自动引用计数仅适用于引用类型,因为这些类型是:

\n
    \n
  1. 总是分配在堆上,因为
  2. \n
  3. 它们必须存在于内存中的稳定位置,以便您可以确保对同一对象的多个引用实际上都指向同一个确切位置(这是对象身份概念的一部分)
  4. \n
\n

这确实意味着某些系统必须跟踪此类类型(对象)的实例何时不再被引用,以便可以清理分配。

\n

相反,值类型不具有与对象相同的身份概念:

\n
    \n
  1. 它们不需要内存中的稳定位置,并且值的每个副本与具有相同属性的另一个副本无法区分,因此
  2. \n
  3. 每次引用值类型时,您都会按获取它的副本(从概念上讲;有一些优化可以避免到处不必要的复制)
  4. \n
\n

值类型不需要分配,也不需要通过诸如析构器之类的东西来维护需要清理的状态。最终结果是不需要跟踪最后一次使用某个值的时间(因为严格不需要重新分配),因此不需要用于清理的引用计数。

\n
\n

高级说明:值类型可以在堆上分配(特别是如果它们足够大),但这是 Swift 的实现细节。如果 astruct被分配,Swift 本身将代表您维护分配和释放,同时仍然按 value透明地传递它。仍然不可能对 this 进行多个引用struct,因此引用计数仍然与它无关(例如,引用计数只能为 0 或 1,因此跟踪没有意义)。

\n