32位C++程序中的最大可寻址内存空间是多少?

Mik*_*ong 1 c++ memory memory-leaks

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

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

实际上,我在64位系统中运行32位程序,但程序因内存泄漏而崩溃时只分配了大约1.5GB的内存......我似乎无法弄清楚原因.

(Oooops ...对不起家伙我认为我在第一个问题上犯了一个简单的错误......实际上,一个十六进制数字是4位,而8位是32位.但是这里有另一个问题......如何在64-表示地址位程序?)

jmi*_*rez 9

对于32位Windows,每个进程的限制实际上是2GB,虚拟地址来自0x00000000(或简单地0x0)0x7FFFFFFF.4GB地址空间的其余部分(0x80000000通过0xFFFFFFFF)供Windows本身使用.请注意,这些与实际的物理内存地址无关.

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

对于大地址空间感知程序(IMAGE_FILE_LARGE_ADDRESS_AWARE)的更高限制,请参见此处:

您可能还想查看Wikipedia上的虚拟内存文章,以更好地了解虚拟地址和物理地址之间的映射是如何工作的.上面的第一个MSDN链接也有一个简短的解释:

进程的虚拟地址空间是它可以使用的一组虚拟内存地址.每个进程的地址空间都是私有的,除非共享,否则其他进程无法访问.虚拟地址不代表对象在内存中的实际物理位置; 相反,系统为每个进程维护一个页表,这是一个内部数据结构,用于将虚拟地址转换为相应的物理地址.每次线程引用地址时,系统都会将虚拟地址转换为物理地址.32位Windows的虚拟地址空间大小为4千兆字节(GB),分为两个分区:一个用于进程,另一个用于系统使用.有关64位Windows中虚拟地址空间的详细信息,请参阅64位Windows中的虚拟地址空间.


编辑:正如user3344003指出的那样,这些值不是您可以使用malloc分配的内存量,或者用于存储值,它们只是表示虚拟地址空间的大小.