在 Debug模式下,我看到指针的地址类似于0x01210040,
但据我所知,0x表示十六进制吗?并且有8个十六进制数字,即总共有128位被寻址?那么这是否意味着对于32位系统,前两位始终为0,而​​对于64位系统,前两位始终为0?

另外,请问对于32位程序,是否可以分配多达3GB的内存,只要我保留在堆中并且仅使用malloc()?还是Windows系统在单线程上存在一些限制? (我使用的IDE是VS2012)

由于实际上我是在64位系统中运行32位程序,但是当该程序仅分配约1.5GB的内存时,该程序因内存泄漏而崩溃了……我似乎不知道为什么。

(糟糕……对不起,我想我对第一个问题犯了一个简单的错误。实际上一个十六进制数字是4位,而8位是32位。但是,这是另一个问题...地址如何在64-位程序?)

最佳答案

对于32位Windows,该限制实际上是每个进程2GB可用空间,虚拟地址从0x00000000(或简称0x0)到0x7FFFFFFF。 Windows本身将使用其余4GB地址空间(0x800000000xFFFFFFFF)。请注意,这些与实际的物理内存地址无关。

如果您的程序知道大的地址空间,则在32位系统上此限制增加到3GB,而在64位Windows上运行的32位程序增加到4GB。

  • http://msdn.microsoft.com/en-us/library/windows/desktop/aa366912(v=vs.85).aspx

  • 对于大型地址空间感知程序(IMAGE_FILE_LARGE_ADDRESS_AWARE)的更高限制,请参见此处:
  • http://msdn.microsoft.com/en-us/library/aa366778.aspx

  • 您可能还想看看Virtual Memory article on Wikipedia,以便更好地了解虚拟地址和物理地址之间的映射是如何工作的。上面的第一个MSDN链接也有简短说明:



    编辑:user3344003 points out一样,这些值不是您可以使用malloc分配或用于存储值的内存量,它们仅表示虚拟地址空间的大小。

    关于c++ - 32位C++程序中最大可寻址内存空间是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25165021/

    10-10 18:53
    查看更多