Swift 5.2 的 memset

memset with Swift 5.2

有时我需要将字节数组的一部分清零。对于 for 循环,这很慢。使用 memset() 函数要快得多。我有以下代码将清除数组 "a".

的元素 200 到 299
var a: [UInt8] = [UInt8](repeating: 1, count: 1000) // a[0..999] set to 1
start = 200
length = 100
memset(&a + start, 0, length) // a[100..199] set to 0

这在 Swift 5.2 和 Xcode 11.4 出来之前一直有效。现在它也可以工作了,但是会出现一个警告:

Inout 表达式创建一个临时指针,但参数 #1 应该是一个比调用“+”还长的指针

这怎么弄的,没有警告。? Andy有人有想法吗?

更多的解释是 Xcode:

  1. 从'[UInt8]'到'UnsafeMutableRawPointer'的隐式参数转换产生一个指针,仅在调用'+'

  2. 期间有效
  3. 在 Array 上使用 'withUnsafeMutableBytes' 方法,以便将参数显式转换为对定义范围有效的缓冲区指针

没看懂,什么意思

使用 withUnsafeMutableBytes 的提示正是您应该遵循的内容:

a.withUnsafeMutableBytes { ptr in
    _ = memset(ptr.baseAddress! + start, 0, length)
}