什么是UnsafeBufferPointer的唯一性检查?

时间:2018-04-10 12:51:51

标签: swift

UnsafeBufferPointer documentation中,它显示“您可以在低级操作中使用UnsafeBufferPointer实例来消除唯一性检查,并在发布模式下使用边界检查。”

我理解边界检查是检查你的索引是否在集合的范围内(即0< = i< length),但在这种情况下什么是唯一性检查?

1 个答案:

答案 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中定义,并获得相同的概述文档。