在UnsafeBufferPointer
documentation中,它显示“您可以在低级操作中使用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中定义的,并获得相同的概述文档。