Buffer.BlockCopy的替代方法,用于引用类型的数组

时间:2014-07-31 08:24:45

标签: c# .net arrays

对于引用类型数组,是否有“ Buffer.BlockCopy ”的安全替代方法?

修改

  1. 我的目的是在不同等级的数组之间移动数据,例如从Object []到Object [,],无需遍历数组。

  2. Buffer.BlockCopy 仅适用于基本类型。

  3. Array.Copy 适用于相同排名的数组。

2 个答案:

答案 0 :(得分:1)

IL has the notion of managed pointers.他们由GC跟踪。该对象未固定。

我相信这个副本可以在C ++ / CLI中安全地删除(或者,如果你想使用Reflection Emit,可以在IL中)。

您需要定义一个这样的函数:

void Copy(int itemCount, ref object firstItemArray0, ref object firstItemArray1);

并称之为:

object[] array0 = new object[11 * 12];
object[,] array1 = new object[11, 12];

Copy(11 * 12, ref array[0], ref array1[0]);

此调用将托管指针提交到CopyCopy现在有一个托管指针,指向要在其间复制的数组的第一个元素。

Copy无法在C#中表示,因为您无法对C#中的托管指针执行指针运算。实际上,ref看起来并不像指针。

Copy的C ++ / CLI实现看起来像这样:

void Copy(
    int itemCount,
    interior_ptr<object^> firstItemArray0,
    interior_ptr<object^> firstItemArray1) {
 for (int i = 0; i < itemCount; i++) {
  firstItemArray1[i] = firstItemArray0[i];
 }
}

只是一个草图。如果您不喜欢C ++ / CLI项目,请反编译IL并使用Reflection Emit生成它。

只是为了说明一点:这是GC友好且无法核实但安全的。我认为没有理由不能投入生产。

现在,为什么不使用for循环呢?使用当前JIT,多维数组很慢。他们在其中绑定了检查和索引计算。这避免了所有这些。

答案 1 :(得分:0)

您可以使用Array.Copyfor循环。 Buffer.BlockCopy基础机制与这些方法之间的差异可以忽略不计,除了像30 FPS左右的运动图像数据。不要过早优化。