Blittable类型的多维数组-如何将不安全的指针固定到内存中?

时间:2018-12-06 09:04:46

标签: c# arrays memory

假设您有一个

Array array;

假设:

  1. 此数组的类型为blittable
  2. 数组在编译时可能具有尺寸为(1..N)任意数 未知

基于这些假设,我相信我们可以假设.Net框架会将其内容存储在内存中的连续区域中。如何获得指向该内存的固定指针

类似...的工作版本。

// Doesn't work, 
// gives "cannot take the address of the given expression"
fixed(object* ptr = &array.GetValue(0))
{
  // ...
}

// Doesn't work, dimensions unknown at compile-time, 
// so could be T[,], or T[,,], or T[,,,] etc. as well
T[] arr = (T[])array;
fixed(object* ptr = &T[0])
{
  // ...
}

谢谢

1 个答案:

答案 0 :(得分:4)

您可能正在寻找Marshal.UnsafeAddrOfPinnedArrayElement(如果只需要根,则可以要求元素0);但是,这里的警告是,您需要手动进行固定(大概使用try / finally)-您不能将fixedArray一起使用。与简单的fixed引用(这只是“本地”声明上的IL标志)相比,它具有更多的开销


注意:如果您始终位于元素0的位置,则AddrOfPinnedObject()上的GCHandle也可以为您提供这些信息,而无需执行Marshal步骤。