在 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地址空间(0x80000000
到0xFFFFFFFF
)。请注意,这些与实际的物理内存地址无关。
如果您的程序知道大的地址空间,则在32位系统上此限制增加到3GB,而在64位Windows上运行的32位程序增加到4GB。
对于大型地址空间感知程序(
IMAGE_FILE_LARGE_ADDRESS_AWARE
)的更高限制,请参见此处:您可能还想看看Virtual Memory article on Wikipedia,以便更好地了解虚拟地址和物理地址之间的映射是如何工作的。上面的第一个MSDN链接也有简短说明:
编辑:与user3344003 points out一样,这些值不是您可以使用malloc分配或用于存储值的内存量,它们仅表示虚拟地址空间的大小。
关于c++ - 32位C++程序中最大可寻址内存空间是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25165021/