使用Swift 5.2的memset

jscom

有时我需要将字节数组的一部分清零。使用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

直到带有Xcode 11.4的Swift 5.2出现为止,这一直很好。现在也可以使用,但是会出现警告:

Inout表达式会创建一个临时指针,但是参数#1应该是一个对“ +”的调用不再有效的指针

没有警告就怎么做到呢?Andybody有个主意吗?

Xcode中的whows还有更多解释:

  1. 从“ [UInt8]”到“ UnsafeMutableRawPointer”的隐式参数转换会产生一个指针,该指针仅在对“ +”的调用期间有效

  2. 在数组上使用“ withUnsafeMutableBytes”方法以便将参数显式转换为对已定义范围有效的缓冲区指针

我不明白,这是什么意思。

Gereon

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章