You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Sequence.map为何采用ContiguousArray实现而非直接用Array?

为什么Swift标准库中Sequence.map用ContiguousArray而非直接用Array实现?

在Swift标准库的Sequence.map实现里,开发者选择先创建ContiguousArray完成元素填充,再转为Array返回,而非直接用Array逐步填充,核心原因是性能优化,具体可以从这几点理解:

  • 更低的内存与操作开销:
    Array是支持与Objective-C桥接的容器,内部带有isa指针、桥接元数据等额外结构,这会带来少量的内存开销和操作损耗。而ContiguousArray是纯Swift环境下的连续内存容器,没有桥接相关的额外成本,在仅需纯Swift内部操作时,性能表现更优。

  • 高效的内存预分配与填充:
    实现中先通过underestimatedCount获取序列的预估元素数量,给ContiguousArray预留初始容量,避免了数组扩容时的内存重新分配与元素拷贝。接着通过两次循环填充:先用for循环处理预估数量内的元素,再用while循环处理超出预估的剩余元素,既保证了预分配内存的充分利用,也不会遗漏任何元素。

  • 低开销的类型转换:
    最后将ContiguousArray转为Array的成本极低——两者底层都是连续内存存储,这个转换只是简单的类型包装,不会触发内存复制,完全不会抵消之前的性能收益。

对应的标准库实现代码:

@inlinable
public func map<T>(
  _ transform: (Element) throws -> T
) rethrows -> [T] {
  let initialCapacity = underestimatedCount

  var result = ContiguousArray<T>()
  result.reserveCapacity(initialCapacity)

  var iterator = self.makeIterator()

  for _ in 0..<initialCapacity {
    result.append(try transform(iterator.next()!))
  }

  while let element = iterator.next() {
    result.append(try transform(element))
  }
  return Array(result)
}

内容的提问来源于stack exchange,提问作者Pogos Anesyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:15:58