-4

假设没有运行时或操作系统的限制。我可以分配一个大于虚拟地址空间的对象吗?

4

1 回答 1

10

我试图在这个措辞奇怪的问题中找到一个真正的问题。这些问题怎么办?

假设有足够的可用虚拟内存空间,.NET 中对象的大小是否存在理论上的限制?

是的。无论操作系统如何,运行时都不允许单个托管对象大于 2 GB。

在 Windows 中分配大于虚拟内存空间的内存块是否合法?

是的。人们常常对这一事实感到惊讶,但请记住,虚拟内存被称为虚拟内存是有原因的;这不是真正的记忆。真正的内存是磁盘空间。

内存不是 RAM——它只是磁盘空间顶部的快速、方便的缓存。而且内存不是虚拟内存;虚拟内存只是一种方便的方式来引用内存。在我看来,内存最好可视化为磁盘上交换文件中的页面。

如果你想在 32 位 Windows 中分配一个 40 亿字节的块,没有问题;操作系统将在磁盘上为您保留 40 亿字节。然后,您可以决定如何将其映射到您的虚拟地址空间;它并不完全适合,因此您将不得不自己管理映射和取消映射。Raymond 在这里描述了如何做到这一点:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/10/211890.aspx

我不知道有任何库可以让您轻松地从 C# 对这么大的内存块进行操作,但是如果还没有可用的库,那么编写一个库并不是特别困难。坦率地说,虽然我倾向于使用内存映射文件(您可以从 C# 中完成)而不是自己进行映射。

于 2013-02-28T00:18:29.263 回答