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:
从'[UInt8]'到'UnsafeMutableRawPointer'的隐式参数转换产生一个指针,仅在调用'+'
期间有效
在 Array 上使用 'withUnsafeMutableBytes' 方法,以便将参数显式转换为对定义范围有效的缓冲区指针
没看懂,什么意思
使用 withUnsafeMutableBytes
的提示正是您应该遵循的内容:
a.withUnsafeMutableBytes { ptr in
_ = memset(ptr.baseAddress! + start, 0, length)
}
有时我需要将字节数组的一部分清零。对于 for 循环,这很慢。使用 memset() 函数要快得多。我有以下代码将清除数组 "a".
的元素 200 到 299var 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:
从'[UInt8]'到'UnsafeMutableRawPointer'的隐式参数转换产生一个指针,仅在调用'+'
期间有效
在 Array 上使用 'withUnsafeMutableBytes' 方法,以便将参数显式转换为对定义范围有效的缓冲区指针
没看懂,什么意思
使用 withUnsafeMutableBytes
的提示正是您应该遵循的内容:
a.withUnsafeMutableBytes { ptr in
_ = memset(ptr.baseAddress! + start, 0, length)
}