我使用Peano-Hilbert数据排序(c ++ 4.9,linux 64x)来合并动态分配的内存。为了控制,我试图可视化内存中的实际数据分布。为此,我将指向我的数据的指针转换为如下的整数
unsigned long int address = *(unsigned long int*)(&pointer);
然后将它们绘制为一些2D地图。它适用于大多数情况,但有时我会得到超过可用内存的值,例如: 140170747903888,对应~127 TB移位,而我只有16 GB的RAM。我勒个去?
答案 0 :(得分:2)
内存管理系统不以线性方式处理内存。可以自由地告诉进程一些内存块在地址0x1234123412345678中,即使你只有128MB的内存。这称为分页。数据甚至可能不在物理内存中,而是分页到磁盘。
这意味着您无法知道物理内存中指针值的位置,因为它可能一直在变化(或者甚至可能不在内存中),您只知道操作系统具有的虚拟地址碰巧送你并且它完全取决于实现方式。
答案 1 :(得分:1)
AMD 64位使用48位作为虚拟内存地址,相当于256TB。虚拟地址空间与物理RAM不同:地址在CPU上的表中查找,实际RAM在首次访问相关页面时出现故障。