【问题标题】:The ContiguousArray's internal structureContiguousArray 的内部结构
【发布时间】:2017-08-02 06:18:00
【问题描述】:

我知道有一些关于ArrayContiguousArray 之间区别的相关问题。

但是,答案集中在如何使用它们,而不是它们本身。

在官方文档中,他们说

ContiguousArray 类型是一个专门的数组,它始终将其元素存储在一个连续的内存区域中。这与 Array 形成对比,Array 可以将其元素存储在内存的连续区域中,如果其 Element 类型是类或 @objc 协议,则可以将其存储在 NSArray 实例中。

因此,在Array 中,如果元素是类或@objc 协议,则元素可能位于连续区域或NSArray 实例中。我认为Array 只是对象的指针。所以,我不明白连续区域的含义。

NSArrayArray 有什么关系? Array 只是 NSArray 的包装吗?

谁能解释一下?

编辑: 当我发布问题时,我对此感到有些困惑。 大概ContiguousArray没有指针吧?因为文档说ContiguousArray 总是将其元素存储在一个连续的区域中。

【问题讨论】:

标签: arrays swift


【解决方案1】:

ArrayContiguousArray 本身没有引用语义。如果您在其中存储值类型的实例,则您的数组元素是原始实例的正确副本。是否有时为了优化(或桥接到 Objective-C)而“在后台”使用指针只是一个实现细节,而不是预期编程模型的一部分,因此通常不是你应该考虑的事情。

但是当低级性能成为一个问题时,ContiguousArray 可以保证元素在内存中连续布局,就像 C 数组一样。常规的Array 实例尽可能提供相同的优化(当它的元素是枚举或结构时)。在其他情况下,它确实可以充当NSArray 的包装器。

【讨论】:

  • 谢谢,我明白了。无论ContiguousArray 的元素是引用类型还是值类型,ContiguousArray 都将元素存储在连续区域中。那么,我可以说ContiguouArray 中的所有实例都存在于堆栈区吗?
  • 一般来说,引用类型的元素仍然使用堆分配,即使是在一个连续的数组中,但是值类型的元素是在栈上分配的。这就是使上述Array 的条件性能提高的原因,以及它们仅限于枚举或结构数组的原因。话虽如此,性能优化有时会违反这些规则。在您只使用值类型的任何地方,您至少可以期待堆栈分配的性能特征
  • 对不起,我又糊涂了。无论我们使用ContiguousArray还是Array,如果我们存储一个类的实例,这些实例是分配到堆区的吗?那么,“连续内存区域”是什么意思? ContiguousArrayArray 都存储类实例的指针?然而,虽然这只是我的假设,但在ContiguousArray 的情况下,所有实例都存储在堆中的一个连续区域中。另一方面,在Array 的情况下,每个实例都存储在堆中的不同区域中。我说的对吗?
  • 分配取决于元素类型,它不会根据它所包含的集合而改变。在此之后,为类和其他引用类型动态分配的存储不是(也不能是)内联存储在由连续数组或任何其他集合管理的缓冲区中。所以你是对的,只有指向动态分配的存储(堆上的实例)的 指针 是连续内联存储的(在堆栈上)。但是,由于存储在堆上的实例的大小可以在运行时任意更改,因此不能保证那里的连续布局。
  • 那么,到底有什么区别呢?对于值类型对象,ContiguousArrayArray 都包含堆栈上连续区域中的元素。另一方面,对于引用类型,ContiguousArrayArray 都包含连续的指针,并且指针指示堆上的实例。所以,好像没什么区别。你能解释一下吗?
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多