【问题标题】:Array.Copy between differently typed arraysArray.Copy 在不同类型的数组之间
【发布时间】:2015-10-31 10:29:28
【问题描述】:

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

但是假设我有一个short[] 和一个char[]。您不能在它们之间使用Array.Copy,因为它们的类型不同,但它们中的元素大小相同,sizeof(short) == sizeof(char)。如何绕过类型限制以执行从short[]char[]memcpy,而不执行for 循环?我说的是 C++ 中 reinterpret_cast<> 的逻辑等价物。

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


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

【问题讨论】:

  • 你试过 Buffer.BlockCopy 吗?
  • @KellyEthridge && nawfal:好吧,我猜你们刚刚回答了我的问题......
  • 如果您的问题得到解答,请发布答案或让回答的评论者发布答案,以便问题实际显示为有答案
  • 恕我直言,您应该少担心代表,多担心网站的完整性。留下一个您不再寻求答案的问题,让其他人可能会浪费时间检查您的问题以便他们可以提供帮助,或者让其他有类似问题的人更难找到实际答案(因为它隐藏在cmets 而不是一个明确的答案)。请注意,如果您回答了该问题并且其他人发现了该问题并对其投了赞成票,那么您将获得比您目前正在考虑的 +2 更多的收益。

标签: c# arrays performance memcpy


【解决方案1】:

您可以使用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),它实际上会将字节复制到从bytesshorts,短裤会变成:

AFC0 2419 0567 F9D7 24B3

是的,Buffer.BlockCopy 本质上就是这样做的——它复制数组的底层字节。


一些提示:

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

  • BlockCopy 不适用于基元。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2023-03-26
    相关资源
    最近更新 更多