gpt4 book ai didi

swift - 什么是 UnsafeBufferPointer 的唯一性检查?

转载 作者:可可西里 更新时间:2023-11-01 01:09:03 28 4
gpt4 key购买 nike

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

我知道边界检查是检查您的索引是否在集合的边界内(即 0 <= i < 长度),但在此上下文中什么是唯一性检查?

最佳答案

当您修改具有写时复制的值类型(例如 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 中定义。并获得相同的概述文档。

关于swift - 什么是 UnsafeBufferPointer 的唯一性检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49754225/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com