数组中.在不同类型的数组之间复制

本文关键字:数组 之间 复制 同类型 | 更新日期: 2023-09-27 18:06:51

如你所知,Array.Copy比手动将数组的内容复制到另一个数组要快,因为它直接从一个位置复制到另一个位置。

假设我有一个short[]和一个char[]。你不能在它们之间做Array.Copy,因为它们不是同一类型的,但它们中的元素大小相同,sizeof(short) == sizeof(char)。我如何规避类型限制,从short[]char[]memcpy,而不做for循环?我指的是c++中的reinterpret_cast<>的逻辑等价物。

TL;DR:如果两个数组具有相同大小的元素,您可以操作它来更快地在它们之间复制元素吗?你总是可以有一个for循环,但我正在寻找更像一个直接的memcpy从一个数组到另一个。


另外,我想再次说明,for循环是不被接受的。我很清楚它们,但这是一个性能问题,询问是否有更有效的方法来做到这一点

数组中.在不同类型的数组之间复制

您可以使用Buffer.BlockCopy。与Array.Copy不同,它将数组的底层字节复制到目标。例如,short由2个字节组成。5的空short[]可能看起来像这样:

                 1 short (0x0000)
                        ˅˅˅˅
    0000 0000 0000 0000 0000
         ^^          ^^
    1 byte (0x00)  Byte #8 (byte index 7)

同时,假设我们有一个byte[],这次有10个索引。它看起来像这样:

                             Last byte [9]
                                   ˅˅
        AF C0 24 19 05 67 F9 D7 24 B3
        ^^
    First byte [0]

现在,请注意这些数组的大小完全相同:short[]是5 x 2字节,而byte[]是10 x 1。因此,如果我们运行Buffer.BlockCopy(bytes, 0, shorts, 0, bytes.Length),它实际上是将字节从bytes复制到shorts,那么短裤将变成:

AFC0 2419 0567 F9D7 24B3

这就是Buffer。BlockCopy会复制数组的底层字节。


一些技巧:

  • 使用具有较小元素的数组来获取计数。例如,如果我在上面的例子中使用shorts.Length作为最后一个参数,我必须将它乘以sizeof(short),否则它只会复制一半的数组。

  • BlockCopy不支持原语