Swift 中的值类型的自动引用计数是如何工作的?
How does Automatic Reference Counting work for Value Types in Swift?
我了解到 Swift 使用自动引用计数 (ARC) 进行内存管理。我想知道它如何用于 Swift.
中的值类型 (struct
)
来自Swift Language Guide on ARC:
Reference counting applies only to instances of classes. Structures and enumerations are value types, not reference types, and aren’t stored and passed by reference.
自动 引用 计数仅适用于引用类型,因为这些类型是:
- 总是分配在堆上,因为
- 它们必须存在于内存中的稳定位置,这样你就可以确定对同一个对象的多个引用确实都是指向相同的确切位置(这是对象的 identity 概念的一部分)
这确实意味着某些系统必须跟踪何时不再引用此类类型(对象)的实例,以便清理分配。
相比之下,值类型没有与对象相同的身份概念:
- 它们不需要内存中的稳定位置,并且值的每个 副本 与具有相同属性的另一个值无法区分,因此
- 每次你引用一个值类型,你都会得到它的copyby value(概念上;有一些优化可以避免到处都是不必要的复制)
不需要分配值类型,也不需要通过诸如析构器之类的东西来维护需要清理的状态。最终结果是不需要跟踪最后一次使用值的时间(因为绝对不需要重新分配),因此不需要引用计数进行清理。
高级说明:值类型 可以 分配在堆上(特别是如果它们足够大),但这是 Swift 的实现细节。如果分配了 struct
,Swift 本身将代表您维护分配和解除分配,同时仍按值 透明地传递它 。仍然不可能对这个 struct
有多个引用,因此引用计数仍然与它无关(例如,引用计数只能是 0 或 1,因此跟踪没有意义)。
我了解到 Swift 使用自动引用计数 (ARC) 进行内存管理。我想知道它如何用于 Swift.
中的值类型 (struct
)
来自Swift Language Guide on ARC:
Reference counting applies only to instances of classes. Structures and enumerations are value types, not reference types, and aren’t stored and passed by reference.
自动 引用 计数仅适用于引用类型,因为这些类型是:
- 总是分配在堆上,因为
- 它们必须存在于内存中的稳定位置,这样你就可以确定对同一个对象的多个引用确实都是指向相同的确切位置(这是对象的 identity 概念的一部分)
这确实意味着某些系统必须跟踪何时不再引用此类类型(对象)的实例,以便清理分配。
相比之下,值类型没有与对象相同的身份概念:
- 它们不需要内存中的稳定位置,并且值的每个 副本 与具有相同属性的另一个值无法区分,因此
- 每次你引用一个值类型,你都会得到它的copyby value(概念上;有一些优化可以避免到处都是不必要的复制)
不需要分配值类型,也不需要通过诸如析构器之类的东西来维护需要清理的状态。最终结果是不需要跟踪最后一次使用值的时间(因为绝对不需要重新分配),因此不需要引用计数进行清理。
高级说明:值类型 可以 分配在堆上(特别是如果它们足够大),但这是 Swift 的实现细节。如果分配了 struct
,Swift 本身将代表您维护分配和解除分配,同时仍按值 透明地传递它 。仍然不可能对这个 struct
有多个引用,因此引用计数仍然与它无关(例如,引用计数只能是 0 或 1,因此跟踪没有意义)。