如果你的C# struct只使用原始数据类型,并且与C++中的本地结构具有完全相同的布局,您可以使用手动内存来解决这些限制m管理和不安全的代码。作为奖励,您将通过避免编组来提高性能。
分配内存:
IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256);
这基本上是malloc
,所以分配的内存是GC的意识之外。
您可以将IntPtr传递给本机代码,就像它是MyStruct[256]
一样,只有IntPtr将被编组,而不是它指向的内存。本机代码和托管代码可以直接访问相同的内存。
读/写的结构与C#数组中,使用C#指针:
static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index)
{
MyStruct *ptr = ((MyStruct *)arr) + index;
return *ptr;
}
static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value)
{
MyStruct *ptr = ((MyStruct *)arr) + index;
*ptr = value;
}
不要忘记
Marshal.FreeHGlobal (arr);
当你与内存中完成,以free
它。
没有解决方法?所以我可以在C++中做到这一点? – uray
@uray我可以建议的唯一的事情是一个常规数组。如果那是不可能的,那么...... –