C指针如何处理36位地址总线?

时间:2013-04-23 12:22:17

标签: c pointers

我有以下代码片段,

  char *chptr;
  int *numptr;

  printf("\nSize of char is %d\n",sizeof(chptr));
  printf("\nSize of int is %d\n",sizeof(numptr));

我得到了以下输出,

Size of char is 4
Size of int is 4   

显然,指针可以存储最多 2 32 - 1 的地址。

我正在使用Windows 7 32-bit操作系统Code::Blocks 10.05MingW

但我的系统正在使用Pentium Dual-Core处理器36 Bit Address Bus。目前我有4 GB RAM。但是假设我将RAM的大小增加到8 GB C指针如何处理这样一个扩展的地址空间? C指针的大小只有32位但是地址空间远远超过2 32

有什么建议吗?先感谢您。

PS :我已经检查了 here 给出的答案,这些答案处理指针中的地址存储,但它们并没有涵盖我相信的问题。

3 个答案:

答案 0 :(得分:4)

您的指针将使用的地址位于虚拟地址空间,而不是物理地址空间(假设您使用的是现代操作系统;您没有在问题中说明。)

O / S内核会在必要时将虚拟内存页面映射到物理地址页面,并在没有用户进程知晓的情况下管理整个内存系统。

如果您使用的是32位操作系统,那么您可能需要2GB的用户地址空间才能进行寻址,当您转移到64位操作系统时,这将大大增加。

查看Virtual Memory上的这篇维基百科文章。

答案 1 :(得分:1)

一些提示:

  1. 检查您的操作系统是32位还是64位。
  2. 检查您的编译器是否能够生成64位指针。
  3. 检查编译器是否有64位指针的其他数据类型。
  4. 检查您的编译器是否具有C语言的扩展名,如关键字far__far等。

答案 2 :(得分:1)

C指针处理8 GB的最简单方法是再次分离代码和数据。然后,您将能够拥有4 GB的代码和4 GB的数据,因此总共为8 GB。无论如何,您无法合法地比较代码指针0x00010000和数据指针0x00010000

但实际上,解决方案是转向64位。 36位黑客没用;今天完全可以使用128 GB的RAM。