我有一个很大的数组,我只想复制它的中间部分。我试图使用memcpy
来提高性能,但找不到方法。下面是一个例子。我们如何向源提供偏移量?
var source: [UInt8] = [1,2,3,4,5,6,7,8,9]
var dest: [UInt8] = [0,0,0,0,0,0,0,0,0]
memcpy(&dest[2], source, 5)
print(dest) // [0, 0, 1, 2, 3, 4, 5, 0, 0]
// This works
var source: [UInt8] = [1,2,3,4,5,6,7,8,9]
var dest: [UInt8] = [0,0,0,0,0,0,0,0,0]
memcpy(&dest[2], &source[2], 5)
print(dest) // [0, 0, 3, 0, 0, 0, 0, 0, 0]
// Only `source[2]` is copied
4条答案
按热度按时间polhcujo1#
您可以使用
replaceSubrange()
来实现此目的:或者简单地将源切片分配给目的地切片:
基准测试
在MacBook Air M2上,代码在Release配置中编译。
结果:
0yg35tkg2#
我建议使用Swift指针API。
当处理
UInt8
数组时,可以使用copyBytes
,取目标数组的一个切片,从中获取一个缓冲区指针,然后将源数组的一个范围复制到该缓冲区。如果要使用
memcpy
,可以从源代码中获取缓冲区指针,并向其添加源代码偏移量。zlwx9yxi3#
似乎在工作:
并给出一堆警告:
“UnsafePointer”的初始化导致指针悬空
从“[UInt8]”到“UnsafePointer”的隐式参数转换生成仅在调用“init(_:)”期间有效的指针
对Array使用“withUnsafeBufferPointer”方法,以便将参数显式转换为对已定义范围有效的缓冲区指针
withUnsafePointer会删除警告:
而且不同的数据类型仍然会有问题。不管数据类型如何,内存中的步幅似乎都是相同的。
c6ubokkw4#
感谢@Martin R,我编辑了他的基准代码,
memcpy
仍然比切片快得多:它具有基准结果: