gpt4 book ai didi

swift - UnsafeMutablePointer 到 [UInt8] 没有内存复制

转载 作者:搜寻专家 更新时间:2023-10-30 21:53:22 26 4
gpt4 key购买 nike

是否可以创建 [UInt8]来自 UnsafeMutablePointer<UInt8>不复制字节?

NSData我可以简单地称之为世界

let data = NSData(bytesNoCopy: p, length: n, freeWhenDone: false)

然后只是包裹指针。

最佳答案

如评论中所述,您可以创建一个UnsafeMutableBufferPointer 来自指针:

let a = UnsafeMutableBufferPointer(start: p, count: n)

不会复制数据,这意味着必须确保只要使用a,指向的数据就是有效的。不安全(可变)缓冲区指针具有类似数组的访问方法,比如下标:

for i in 0 ..< a.count {
print(a[i])
}

或枚举:

for elem in a {
print(elem)
}

您可以使用缓冲区指针创建一个“真正的”数组

let b = Array(a)

但这会复制数据。

下面是一个完整的例子来演示上述语句:

func test(_ p : UnsafeMutablePointer<UInt8>, _ n : Int) {

// Mutable buffer pointer from data:
let a = UnsafeMutableBufferPointer(start: p, count: n)
// Array from mutable buffer pointer
let b = Array(a)

// Modify the given data:
p[2] = 17

// Printing elements of a shows the modified data: 1, 2, 17, 4
for elem in a {
print(elem)
}

// Printing b shows the orignal (copied) data: 1, 2, 3, 4
print(b)

}

var bytes : [UInt8] = [ 1, 2, 3, 4 ]
test(&bytes, bytes.count)

关于swift - UnsafeMutablePointer<UInt8> 到 [UInt8] 没有内存复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31106427/

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