UnsafeBufferPointerdocumentation中,它显示“您可以在低级操作中使用UnsafeBufferPointer实例来消除唯一性检查,并在释放模式中消除边界检查。”
我知道边界检查正在检查您的索引是否在集合的边界内(即0

最佳答案

当修改具有“写时复制”(copy-on-write)的值类型(例如Array)时,会检查当前引用是否唯一(请参见isKnownUniquelyReferenced)。如果它是唯一引用的,则不需要复制,并且可以直接在缓冲区上发生变异。每次修改数组时,都可能发生这种唯一性检查:

var array = [1,2,3]

array[0] = 2 // Check for uniqueness
array[1] = 3 // Check for uniqueness
array[2] = 4 // Check for uniqueness

我相信优化器可以在某些情况下消除这些检查(实际上我认为它在很多情况下都会这样做),所以这可能并不总是发生,但优化器不能总是做到这一点。
在优化器无法确定的情况下,不安全的缓冲区可以。例如:
array.withUnsafeMutableBufferPointer { (ptr) -> Void in
    ptr[0] = 3
    ptr[1] = 4
    ptr[2] = 5
}

withUnsafeMutableBufferPointer的调用将执行唯一性检查并在必要时创建副本,但对ptr[x]的每个引用都不会重新检查唯一性。
这不应被视为建议使用withUnsafeMutableBufferPointer“来提高性能。”简单地编写代码,让优化器完成它的工作,并进行配置。但在某些情况下,性能优势可能是值得的。
顺便说一句,我不知道这种唯一性检查对不可变缓冲区有什么影响(UnsafeBufferPointer)。我相信它只适用于UnsafeMutableBufferPointer。但这两种类型都是在同一个gyb file中定义的,并获得相同的概述文档。

07-28 03:45
查看更多