交换固定数组的指针与非托管内存指针

时间:2016-09-14 14:40:35

标签: c# unmanaged-memory

我正在钉住并取消固定:

    GCHandle pinArray(object a)
    {
        return GCHandle.Alloc(a, GCHandleType.Pinned);
    }

    void unpinArray(GCHandle h)
    {
        h.Free(); 
    }

在opencl方法之前和之后,因此数组在计算时不会移动。现在我需要用一个对齐的非托管数组指针交换支持数组指针,以便对它进行更快的读/写操作。

但我找不到任何类似“改变gchandle支持数组指针值”的信息。

我需要类似“交换”方法的东西:

 GCHandle h=pinArray(array);

 // how to?
 IntPtr oldBackingArray=exchange(h,alignedMallocCSpace(10000000,4096));

 // unmanaged operations
 copyValues(h,oldBackingArray);
 compute(array,...); // only passing with "array" for simplicity everywhere
 array[3]=5;
 l=array.toList();
 compute(array,....);
 Console.WriteLine(array[3]);
 copyValues(oldBackingArray,h);


 freeCSpace(exchange(h,oldBackingArray));

 unpinArray(h);

这需要反射来访问和更改该变量吗?在计算方法中也有很多使用这些数组的C#方法,所以即使在C#空间也能提供更快的速度吗?所以我想让C#使用alignedAlloc空间来处理所有使用“array”对象的空间,直到我取消它为止。

1 个答案:

答案 0 :(得分:1)

你不需要。 GCHandle与托管内存有关;非托管内存不需要任何类型的GCHandle。也不可能像那个托管数组那样与那个内存交谈。相反,您需要接受非托管数据是指针而只是指针。您可以在其顶部进行抽象以隐藏这些细节,但它不会改变现实。幸运的是,对于不经意的观察者来说,与SomeType[]交谈非常类似于与SomeType*交谈 - 只要你绕过自己的长度。

将来,即将到来的Span<T>可以很好地统一指针和数组,但目前只是实验性的。