在UnsafeBufferPointer
documentation中,它显示“您可以在低级操作中使用UnsafeBufferPointer
实例来消除唯一性检查,并在发布模式下使用边界检查。”
我理解边界检查是检查你的索引是否在集合的范围内(即0< = i< length),但在这种情况下什么是唯一性检查?
答案 0 :(得分:2)
修改具有写时复制的值类型(例如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中定义,并获得相同的概述文档。