繁体   English   中英

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

[英]Alternative to Buffer.BlockCopy for arrays of reference types

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

编辑

  1. 我的目的是在不同等级的数组之间移动数据,例如从Object []到Object [,]而不迭代数组。

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

  3. Array.Copy适用于相同等级的数组。

IL具有托管指针的概念。 它们由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]);

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

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,多维数组很慢。 他们在其中绑定了检查和索引计算。 这避免了所有这一切。

您可以使用Array.Copy或只使用for循环。 除了以30 FPS左右的运动图像数据之外, Buffer.BlockCopy和这些方法之间的机制之间的性能差异可以忽略不计。 不要过早优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM