2011-11-01 208 views
8

我如何聲明結構類型的固定大小的數組在C#:固定大小陣列

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

public class MyClass { 
    ... 
    public fixed MyStruct myStruct[256]; 
} 

這將導致到CS1663:結構類型的固定大小的緩衝區是不允許的,我怎麼我不喜歡使用C#或「託管集合數據結構」類型,因爲我需要頻繁地將其與本機C++進行比較。

回答

9

如果你的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它。

3

您不能; per the definition

唯一的限制是,數組類型必須是boolbytecharshortintlongsbyteushortuintulongfloat,或double.

+0

沒有解決方法?所以我可以在C++中做到這一點? – uray

+0

@uray我可以建議的唯一的事情是一個常規數組。如果那是不可能的,那麼...... –