2014-03-31 41 views
0

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

我的问题是我们是否能够使用不安全的块在C#创建的超过2GB大小更大的在32位机器不安全阵列(即3GB数组)。

+8

你将如何处理32位地址空间的4GB阵列? –

+0

@presiuslitelsnoflek好的。不是一个好例子。比方说3GB阵列。 – koumides

回答

3

虽然理论上你可以在32位进程分配大数组在实践中你会碰到的地址空间碎片问题。我建议找到其他方法,因为在32位进程中找到超过2GB的连续地址空间是很少见的。

请注意,您还需要确保过程有“大的地址空间感知”的标志(我觉得默认的.Net二进制文件有它,但检查anayway)。

2

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

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

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

对于用户数据,可能允许多于2 GB的内存,但仍然不是所有的3.5 GB,因为系统仍然需要一些内存,并且与内存中的其他内容不同,获得大于2 GB的可用于大对象分配的空间。

+0

我同意你的观点。不过,我认为对于3GB内存,我相信理论上至少有可能使用不安全的指针进行操作。 – koumides