C#:如何高效地复制大型结构体数组?

5

可能重复:
C#: 有更快的复制数组的方法吗?

我有一个这样的结构体数组:

struct S
{
    public long A;
    public long B;
}

...
S[] s1 = new S[1000000];
...
S[] = new S[s1.Length];
// Need to create a copy here.

我可以使用不安全模式,将结构体源数组复制到字节数组中,然后再从字节数组复制到目标结构体数组。但这意味着我必须分配一个巨大的中间字节数组。是否有避免这种情况的方法?是否可能以某种方式将目标数组表示为字节数组,并直接进行复制?

unsafe
{
    int size = Marshal.SizeOf(s0[0]) * s0.Length;
    byte[] tmp = new byte[size];
    fixed (var tmpSrc = &s0[0])
    {
        IntPtr src = (IntPtr)tmpSrc;
        Marchal.Copy(tmpSrc, 0, tmp, 0, size);
    }

    // The same way copy to destination s1 array...
}

9
你尝试过普通的数组复制并对其进行性能测试吗?在优化之前先验证普通方法是否太慢。 - Servy
@PeterRitchie 移除了我的评论。实际上使用 Buffer.BlockCopy 可能是更好的选择。尽管如此,这个问题仍然是有效的。从实际角度来看可能不太重要 :) - Schultz9999
看起来这是一个合理的重复标志...考虑不要删除。 - Alexei Levenkov
1
我投票支持重新开放,因为这是关于结构体数组的问题,因此之前链接的问题并没有解决这个问题。例如,BlockCopy仅适用于原始类型的数组,而不适用于结构体。 - redcalx
1个回答

0

在使用Buffer.BlockCopy时,它会将bytes[]复制到byte[],而不是数组中的逻辑元素。

但这实际上取决于具体情况。

请先测试您的代码是否可以使用Array.Copy来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接