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

时间:2013-12-25 11:22:37

标签: c++ c pointers memory

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

int *p;
printf("%d\n", (int)sizeof(p));

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

要访问> 4GB的地址空间,您可以执行以下操作之一:

  • 在64位操作系统上编译x86_64(64位)。这是最简单的。
  • 使用AWE memory。 AWE允许映射一个(通常)高于4GB的内存窗口。可以反复映射和重新映射窗口地址。在32位时代用于大型数据库应用程序和RAM驱动器。

请注意,MSB为1的内存地址是为内核保留的。 Windows允许在几种情况下使用最多3GB(每个进程),最高1GB始终用于内核。

默认情况下,32位进程具有2GB的用户模式地址空间。通过特殊的链接器标志(在VS:/ LARGEADDRESSAWARE中)可以获得3GB。

答案 2 :(得分:2)

" 4GB内存后指针如何指向地址?"

处理器可用的物理内存与"虚拟内存之间存在差异。看到这个过程。 32位进程(其指针大小为4字节) 限制为4GB,但处理器维护一个映射(由操作系统控制),使每个进程都有自己的内存空间,最高可达4GB每个

这样,如果有两个进程每个使用4GB,则可以在32位系统上使用8GB内存。