C# 2GB+内存分配

C# 2GB+内存分配,c#,memory,C#,Memory,我需要在一块中分配超过2GB的内存 我不能使用数组,因为有2GB限制 即使我使用.NETFramework4.5,它允许我分配超过2GB的内存,我仍然不想使用数组对象 我需要像GlobalHAlloc这样的东西,但是这个方法只有32位大小的参数 我应该使用Windows API还是什么?我知道这很难做到,而且我知道我会漏掉很多记忆,因为我没有技能做到这一点 但是在.NETFramework4.5中是否有类似GlobalHAlloc的东西可以让我轻松地分配内存?我想做我自己的类MemoryBloc

我需要在一块中分配超过2GB的内存

我不能使用数组,因为有2GB限制 即使我使用.NETFramework4.5,它允许我分配超过2GB的内存,我仍然不想使用数组对象 我需要像GlobalHAlloc这样的东西,但是这个方法只有32位大小的参数 我应该使用Windows API还是什么?我知道这很难做到,而且我知道我会漏掉很多记忆,因为我没有技能做到这一点


但是在.NETFramework4.5中是否有类似GlobalHAlloc的东西可以让我轻松地分配内存?我想做我自己的类MemoryBlock,因为我不喜欢array类。

您可以使用许多方法来获得更大的内存块

AllocHGlobal实际上接受一个IntPtr,它是64位上的64位大小的值。 调用本机函数HeapAlloc。同样,它需要一个指针大小的参数。 调用本机函数CoTaskMemAlloc函数,该函数也接受指针大小的参数。 由于您声明AllocHGlobal只接受32位参数,因此您的进程似乎是32位的。这才是真正的问题。在32位进程中,分配的总容量不能超过4GB。这个限制是由指针的大小决定的。作为进一步的限制,在32位操作系统中,进程分配的总容量不能超过2GB


因此,我建议您需要切换到64位进程来解决您的问题。

请告诉我们您为什么不喜欢阵列?您希望如何处理内存?您只需要一组字节吗?它是一个复杂对象的集合吗?当然,它们的大小是多少?您计划如何处理分配的内存?它是可以拆分的,还是必须是连续的?为什么需要分配这么大的内存块..?另外,32位FFFFFFFF==4GB,否?@activwerx数组采用带符号的int,并且不使用负范围,因此数组中的最大项是2^31,而不是2^32+1。旁注:我不认为在32位上分配的内存不能超过2GB是完全正确的-理论上,在x64版本的Windows上运行的32位进程最多可以达到4GB,如果为32位版本设置了/3GB标志,则最多可以达到3GB。实际上,由于地址空间碎片,最大大小要小得多…@AlexeiLevenkov我确实知道这一点,但感谢您添加评论。我真的不想进入大地址和/3GB!!谢谢,我有64位操作系统,不知道IntPtr依赖于平台。我没有内存管理技能,所以你推荐我AllocHGlobal?我能做些错事吗?或者它只是Alloc和Free?我不确定一旦分配了这个缓冲区,您将如何处理它。UnmanagedMemoryStream看起来确实是个不错的选择。事实上,64位操作系统并不是关键因素。您的进程也是64位的吗?或者它的目标是x86?64位。x64该内存流在读取方法中有32位偏移量?