Mono 的 Array.Copy 在多维数组中不必要地装箱

Sai*_*uji 5 c# mono

我注意到 Array.Copy 在多维数组上使用时会导致大量堆分配。具体来说,请考虑以下几点:

static void Test()
{
    int size = 100;
    byte[,] source = new byte[size, size];
    byte[,] target = new byte[size, size];
    Copy(source, target);
}

static void Copy(byte[,] source, byte[,] target)
{
    System.Array.Copy(source, target, source.Length);
}
Run Code Online (Sandbox Code Playgroud)

复制方法会产生 332 KB 的垃圾。

深入挖掘,这一切都来自 GetValueImpl 方法。我检查了单声道源代码(我为此使用单声道编译器),似乎 Array.Copy 首先尝试执行 FastCopy (尚未找到其实现),如果失败,它最终会执行

Object srcval = sourceArray.GetValueImpl (source_pos + i);
Run Code Online (Sandbox Code Playgroud)

对于数组中的每个元素。字节数 (332K) 与装箱两个数组中每个元素所产生的数量完全对应。

如果我用长度为 10000 的 1d 数组替换 2d 数组,则不会发生这种情况:我的 Copy 方法不会产生任何分配。我错过了什么还是这是一个错误?