2011-11-01 83 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我可以建议的唯一的事情是一个常规数组。如果那是不可能的,那么...... –