指针可以指向4GB后的地址吗?

rul*_*lof 6 c c++ memory pointers

如果我们编译并执行以下代码:

int *p;
printf("%d\n", (int)sizeof(p));
Run Code Online (Sandbox Code Playgroud)

似乎指向任何类型的指针的大小是4个字节,这意味着32位,因此2 32个地址可以存储在指针中.由于每个地址与1个字节相关联,因此2 个32个字节为4 GB.

那么,4 GB内存后指针如何指向地址?一个程序如何使用超过4 GB的内存?

Jac*_*ack 6

原则上,如果你不能代表一个过去的地址,2^X-1那么你就无法处理超过2^X字节的内存.

对于x86来说也是如此,即使已经实现并使用了一些变通方法(如PAE),这些变通方法允许拥有更多的物理内存,即使受到这些事情的限制,这些限制也比问题的真正解决方案更为严重.

使用64位架构时,指针的标准大小加倍,因此您不必再担心了.

请注意,在任何情况下,虚拟内存都会将地址从进程空间转换为物理空间,因此很容易看出硬件可以支持更多内存,即使从进程角度来看最大可寻址内存仍然受到大小的限制一个指针.

  • @rullof它们是保留的,必须为零.这就像看到一个有四位数价格的收银机并询问额外数字是多少,即使商店里的任何东西都不超过999欧元.这意味着如果商店增加了1000欧元的东西,它就不必重新设计他们的收银机. (2认同)