【问题标题】:memset with Swift 5.2使用 Swift 5.2 的 memset
【发布时间】:2020-07-09 01:28:36
【问题描述】:

有时我需要将字节数组的一部分清零。使用 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. 在 Array 上使用“withUnsafeMutableBytes”方法,以便将参数显式转换为对定义范围有效的缓冲区指针

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

【问题讨论】:

    标签: swift xcode memset


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这行得通。我收到了一个新警告:调用“withUnsafeMutableBytes”的结果未使用。所以我加了一个下划线:_ = a.withUnsafeMutableBytes...
    • 糟糕,是的,感谢您的提示。其实把返回值隐藏在闭包里面比较好,我已经更新了答案
    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多