对于引用类型数组,是否有“ Buffer.BlockCopy ”的安全替代方法?
修改:
我的目的是在不同等级的数组之间移动数据,例如从Object []到Object [,],无需遍历数组。
Buffer.BlockCopy 仅适用于基本类型。
Array.Copy 适用于相同排名的数组。
答案 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]);
此调用将托管指针提交到Copy
。 Copy
现在有一个托管指针,指向要在其间复制的数组的第一个元素。
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.Copy或for
循环。 Buffer.BlockCopy
基础机制与这些方法之间的差异可以忽略不计,除了像30 FPS左右的运动图像数据。不要过早优化。