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

Swift可变数组内存更新机制与CoW疑问及优化咨询

关于Swift数组操作与嵌套函数的问题解答

问题1:Swift中Array作为值类型,交换元素时是否每次都会创建新副本?

Swift数组采用**写时复制(Copy-on-Write, COW)**机制。你的代码里,arr是外部作用域的可变变量,且只有嵌套的partition函数这一个引用在访问它。执行元素交换操作时,因为没有其他对该数组的独立引用,系统不会创建新副本,而是直接在原内存块上修改元素值。只有当数组存在多个活跃引用时,修改操作才会触发复制。

问题2:将partition改为带inout参数的函数是否更优?

不会更优。当前嵌套函数已经通过变量捕获直接访问外部的arr,由于数组只有这一个活跃引用,写时复制机制不会触发,操作效率和直接访问原内存一致。改成inout参数传递的话,底层逻辑和捕获几乎相同,但会让代码冗余(每次调用partition都要手动传入arr),没有性能上的额外优势。

问题3:执行arr.append((4, 8))时是否会创建新副本?

这取决于数组当前的剩余容量:

  • 如果数组当前已分配的内存容量大于等于当前元素数+1,append会直接在原内存块末尾添加新元素,不会创建副本。
  • 如果容量不足,Swift会重新分配一块更大的内存(通常是当前容量的1.5~2倍),将原数组元素复制到新内存后再追加新元素,此时会产生副本。

相关代码参考:

func quickSelect(nums: [Int], k: Int) -> [Int] {

    // ... some logic 

    var arr = [(Int, Int)]() // nums frequencies eg: [(1, 2), (3, 5), (2, 8)]
    func partition(start: Int, end: Int) -> Int {
        var swap = start 

        for i in start..<end {
            if arr[i].1 > arr[end].1 {
                (arr[i], arr[swap]) = (arr[swap], arr[i]) // arr copied on write?
                swap += 1
            }
        }
        (arr[end], arr[swap]) = (arr[swap], arr[end]) // arr copied on write?
        return swap
    }

    // ... some logic 

}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:20:13