我有以下代码片段,
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.05
和MingW
。
但我的系统正在使用Pentium Dual-Core
处理器36 Bit Address Bus
。目前我有4 GB RAM。但是假设我将RAM的大小增加到8 GB
, C指针如何处理这样一个扩展的地址空间? C指针的大小只有32位但是地址空间远远超过2 32 。
有什么建议吗?先感谢您。
PS :我已经检查了 here 给出的答案,这些答案处理指针中的地址存储,但它们并没有涵盖我相信的问题。
答案 0 :(得分:4)
您的指针将使用的地址位于虚拟地址空间,而不是物理地址空间(假设您使用的是现代操作系统;您没有在问题中说明。)
O / S内核会在必要时将虚拟内存页面映射到物理地址页面,并在没有用户进程知晓的情况下管理整个内存系统。如果您使用的是32位操作系统,那么您可能需要2GB的用户地址空间才能进行寻址,当您转移到64位操作系统时,这将大大增加。
查看Virtual Memory上的这篇维基百科文章。
答案 1 :(得分:1)
一些提示:
far
或__far
等。答案 2 :(得分:1)
C指针处理8 GB的最简单方法是再次分离代码和数据。然后,您将能够拥有4 GB的代码和4 GB的数据,因此总共为8 GB。无论如何,您无法合法地比较代码指针0x00010000
和数据指针0x00010000
。
但实际上,解决方案是转向64位。 36位黑客没用;今天完全可以使用128 GB的RAM。