64位库限制为4GB?

时间:2009-07-18 23:45:07

标签: c++ 32bit-64bit

我正在使用一个图像处理库,当我尝试加载图像时会抛出异常> 4GB大小。它声称是64位,但64位库不允许加载大于此的图像吗?我认为他们使用64位内存模型/编译器重新编译了他们的C库,但仍然使用无符号整数并且升级失败以使用64位类型。

这是一个合理的结论吗?

编辑 - 作为一个经过深思熟虑后,操作系统内存会变得如此分散,以至于不再可能分配大块? (它在重新启动后也无法正常工作,但只是想知道。)在.NET下呢? .NET托管内存是否会变得如此分散,以至于大块的分配失败了?

3 个答案:

答案 0 :(得分:4)

这是一个合理的建议,但确切的原因可能是很多事情 - 例如你运行的操作系统,你有多少内存/交换?应用程序/操作系统可能不会过度提交虚拟内存,因此您需要4GB(或更多)空闲RAM才能打开图像。

出于兴趣,它似乎是4GB边界的明确停止 - 即3.99GB图像成功,但4GB失败 - 你说这确实表明在图书馆中明确使用32位大小数据结构。

<强>更新

关于你的第二个问题 - 不是真的。几乎所有现代操作系统都使用虚拟内存,因此每个进程都会获得自己的连续地址空间。进程地址空间中的单个连续区域不需要由连续的物理RAM支持,它可以由许多独立的RAM物理区域组成,看起来像是连续的;所以操作系统不需要一个4GB的RAM空间来为你的应用程序提供4GB的块。

应用程序可能会碎片化它的虚拟地址空间,使得没有连续4GB区域的空间,但考虑到64位地址空间的大小,它可能在您的场景中不太可能。

答案 1 :(得分:1)

是的,除非二进制文件格式本身限制了图像的大小。

答案 2 :(得分:1)

要回答您的跟进,我最近阅读了this文章并发现它很有趣。

是的,.NET可能会遇到memory fragmentation的问题。