固定大小的结构类型数组

如何在C#中声明结构类型的固定大小数组:

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] public unsafe struct MyStruct{ ... } public class MyClass { ... public fixed MyStruct myStruct[256]; } 

这将导致CS1663:不允许使用结构类型的固定大小缓冲区,我该如何解决这个问题?我不喜欢使用C#或“托管集合数据结构”类型,因为我需要经常将其编译为本机C ++

如果您的C#struct仅使用原始数据类型并且与C ++中的本机结构具有完全相同的布局,则可以通过手动内存管理和不安全的代码来解决这些限制。 作为奖励,您将通过避免编组来提高性能。

分配内存:

 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它。

你不能; 根据定义

唯一的限制是数组类型必须是boolbytecharshortintlongsbyteushortuintulongfloatdouble.