如果我有一个来自一个 API 的 NSData* 并且需要将其转换为另一个 API 的 std::vector ,有没有办法安全地做到这一点而不复制 NSData 中的字节(假设一个非常大的 NSData *)?
问问题
3499 次
2 回答
5
没有想到的快速解决方案,没有。
如果您创建 NSData 对象(而不是由另一个 API 返回),您可能会考虑子类化NSData
和/或NSMutableData
当您确实需要避免复制时——那么您可以直接访问存储 (std::vector)。
在某些情况下,您还可以通过使用“您的”分配创建数据来绕过它:
NSData * data([[NSData alloc]
initWithBytesNoCopy:vector.data()
length:vector.size()
freeWhenDone:false]);
当然,您需要确保在NSData
释放对象之前未调整向量的大小(或重新分配其后备存储)。
有时您还需要考虑更改参数类型,使其不是std::vector
. 在容纳其他集合类型时,具有NSData
成员和类似矢量的接口、迭代器或 begin+end 的小容器可能就足够了。
于 2013-05-27T22:48:43.857 回答
1
我对 stl 或 cpp 知之甚少,但如果你可以从 void* 缓冲区构造一个向量,那么你应该能够:
void * buffer = [data bytes];
size_t len = [data length];
请记住,数据拥有缓冲区,因此您可能无法释放它。
于 2013-05-28T00:14:53.233 回答