如果你的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我可以建議的唯一的事情是一個常規數組。如果那是不可能的,那麼...... –