【发布时间】:2014-08-06 16:00:02
【问题描述】:
在调试模式下,我看到指针的地址为 0x01210040, 但正如我意识到的那样,0x 表示十六进制对吗?并且有 8 个十六进制数字,即总共有 128 位被寻址?那么这是否意味着对于 32 位系统,前两位始终为 0,而对于 64 位系统,前两位始终为 0?
另外,我可以问一下,对于一个 32 位程序,只要我留在堆中并且只使用 malloc(),我是否能够分配多达 3GB 的内存?还是 Windows 系统在单个线程上存在一些限制? (我使用的IDE是VS2012)
因为实际上我是在 64 位系统中运行一个 32 位程序,但是当它只分配大约 1.5GB 内存时,该程序因内存泄漏而崩溃……我似乎无法弄清楚为什么.
(哎呀……对不起,伙计们,我想我在第一个问题上犯了一个简单的错误……确实,一个十六进制数字是 4 位,而 8 是 32 位。但是这是另一个问题……地址是如何表示的64位程序?)
【问题讨论】:
-
2^32 字节 = 4294967296B = 4GB
-
每个十六进制数字是 4 位,所以 8 个十六进制数字 == 32 位...
-
arrrgh!! 没错...为什么我只是有一个疯狂的想法,每个十六进制数字都是两个字节...
-
你到底在问什么?在 32 位程序中,地址是 32 位值。在 64 位程序中,地址是 64 位值(尽管only the low 48 bits are used)。十六进制表示仅用于向人类显示地址,就像它们以二进制表示的所有数字一样(这就是 bit 的含义)
-
在线性地址空间中,可能的地址空间为4GB。需要注意的是,许多硬件项目都是内存映射到地址的。所以你的程序可能无法处理整个范围。
标签: c++ memory memory-leaks