32位进程能否在64位Windows操作系统上访问更多的内存?

8
据我的理解,在32位Windows上,如果没有使用/3GB开关,32位进程只能访问2GB的内存,其中一些内存被操作系统用于自己的目的。这似乎符合我的经验,因为我们有一个应用程序,在达到大约1.2-1.5 GB的RAM时会崩溃,即使还有很多可用内存也不会出现内存异常。
将此32位应用程序移动到64位Windows上是否允许它访问超过1.5GB的内存?该应用程序本身是否必须升级为64位?

你的意思是,它能够访问一个32位指针所表示的完整4GB吗?它当然不能在没有一些工作的情况下寻址超过4GB,但我也很想知道它能否使用比在32位Windows下更多的内存。 - erickson
4个回答

13
Visual Studio的新版本有一个新标志,可以使32位应用程序“大地址空间感知”。基本上它的作用是说,如果在64位Windows上加载,那么它将获得4GB(32位指针的限制)。这肯定比32位Windows上获得的2或3GB要好。参见http://msdn.microsoft.com/en-us/library/aa366778.aspx
特别是它说:
内存和地址空间的限制因平台、操作系统以及LOADED_IMAGE结构的IMAGE_FILE_LARGE_ADDRESS_AWARE值和4GB调整(4GT)是否正在使用而异。可以使用/LARGEADDRESSAWARE链接器选项设置或清除IMAGE_FILE_LARGE_ADDRESS_AWARE。
另请参见:http://msdn.microsoft.com/en-us/library/wz223b1z.aspx

4

在正确的情况下,Windows上的32位进程可以访问完整的4GB内存,而不是通常限制为2GB。

为了实现这一点,您需要以下内容:

  • 应用程序必须在64位操作系统上运行
  • 应用程序必须使用/LARGEADDRESSAWARE标志进行编译。
  • 应该测试应用程序以确保它在这种情况下实际上可以正常工作。 ;) (特别是依赖于所有指针指向2GB边界以下地址的代码在这里显然无法工作)

1

你的应用程序将受指针大小限制,在你的例子中是32位。

如果你的应用程序需要访问更多内存,那么你将需要一种分段内存结构,就像我们在16位时代使用16位指针和偏移量来访问完整的32位内存空间一样。


1

WOW64允许在64位Windows上使用32位Windows应用程序,将32位指针转换为真正的64位指针。实际上,32位寻址应该允许访问4GB的内存。


32位指针在32位代码运行时无法转换为64位。只有在进入和退出64位代码时,WOW64才会介入。 - Robin Caron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接