不安全的C#绕过2GB限制

时间:2014-03-31 17:25:55

标签: c# .net memory-management

据我所知,在.NET中,数组和其他对象的限制最大为2GB。 我知道在64位机器上我们可以使用gcAllowVeryLargeObjects来解决这个问题并创建大于2GB的数组。

我的问题是我们是否可以使用C#中的不安全块在32位机器中创建大于2GB大小的不安全阵列(即3GB阵列)。

2 个答案:

答案 0 :(得分:3)

虽然理论上你可能能够在32位进程中分配大型数组,但实际上你会遇到地址空间碎片问题。我建议找一些其他方法,因为在32位进程中发现超过2GB的连续地址空间是罕见的。

请注意,您还需要确保进程具有"大地址空间感知" flag(我认为默认情况下.Net二进制文件有它,但检查anayway)。

答案 1 :(得分:2)

不,这是不可能的,但它不是C#或其数组实现的限制。

32位计算机的总地址空间为4 GB。其中一些用于硬件访问,因此可用的地址空间大约为3.5 GB,根据计算机中的内存硬件而有所不同。

通常,2 GB以上的地址空间是为系统保留的,因此您的应用程序数据只有2 GB的可用地址空间。由于这包括你的程序,堆栈和堆,大型对象堆甚至没有2 GB可用。

可能允许超过2 GB的内存用于用户数据,但仍然不是所有的3.5 GB,因为系统仍然需要一些,并且你在内存中拥有的其他东西你不会赢得对于大型对象分配,可以获得超过2 GB的空间。