指针值超过可用内存?如何?

Pointer value exceeds available memory? How?

我致力于 Peano-Hilbert 数据排序(c++ 4.9,linux 64x)以合并动态分配的内存。为了控制,我试图可视化内存中的实际数据分布。为此,我将指向我的数据的指针转换为整数,如下所示

unsigned long int address =  *(unsigned long int*)(&pointer);

然后将它们绘制成一些二维地图。它在大多数情况下工作正常,但有时我得到的值超过可用内存,例如140170747903888,对应于 ~127 TB 的偏移,而我只有 16 GB 的 RAM。我勒个去?

内存管理系统不以线性方式处理内存。可以随意告诉进程某个内存块位于地址 0x1234123412345678 中,即使您只有 128MB 的内存。这称为分页。数据甚至可能不在物理内存中,而是分页到磁盘。

这意味着你无法知道指针值在物理内存中的哪个位置,因为它可能一直在变化(或者它甚至可能不在内存中),你只知道虚拟地址OS刚好给你。它完全取决于实现方式,它是如何发出它们的。

AMD 64位使用48位虚拟内存地址,对应256TB。虚拟地址 space 与物理 RAM 不同:地址在 CPU 上的 table 中查找,而实际 RAM 在首次访问有问题的页面时出现故障。