从您的问题或图像中不完全清楚,但使用“系统地址空间”可能意味着2GB-4GB之间的区域。这确实占据了理论上4GB空间的一半,但有一个合理的理由。
通常使用32位,您可以寻址4 GB的内存(2^32 = 4294967296),因此拥有4 GB的地址空间似乎是合乎逻辑的,而不是2 GB。这样做的原因是: 假设你有2个三分球,这样在C/C++:
char *ptr1;
char *ptr2;
我现在想知道有什么区别的两个指针之间,就像这样:
offset = ptr2 - ptr1;
'offset'的数据类型应该是什么? 如果我们不知道ptr1是否在ptr2之前,反之亦然,偏移量可以是正数也可以是负数。现在,如果ptr1或ptr2的范围在0 - 2GB之间,那么偏移总是在-2147483648和+2147483647之间,这完全符合4字节有符号整数。
但是,如果ptr1和ptr2能够访问完整的4 GB地址空间,则偏移量将介于-4294967296和+4294967295之间,不再适合4字节有符号整数。
如果您确定自己从未在应用程序中进行过这种计算,或者您确定如果您减去2个指针,它们将永远不会超过2 GB(或者您的向量总是小于2 GB),你可以告诉链接器(Windows,Visual Studio)你的应用程序是LARGEADDRESSAWARE。此链接器标志在可执行文件中设置了一些位,如果32位Windows正确引导(在XP上必须使用/ 3GB引导),则Windows为您提供了3GB而不是2GB(仅用于LARGEADDRESSAWARE可执行文件)。 其余1GB仍用于操作系统数据结构(但我没有关于它们的详细信息)。
如果您运行的是64位Windows,那么情况会变得更加有趣,因为LARGEADDRESSAWARE可执行文件将获得4GB的内存。显然,操作系统数据结构现在存储在应用程序使用的4GB以外的64位地址空间的某处。
希望澄清一下。
我要告诉你一个坏消息拍摄照片。你想要的东西不能提供。它不仅取决于操作系统,还取决于正在使用的操作系统版本。此外,您的用户地址空间图也不完整,取决于您使用的编译器以及它的版本。 – 2010-06-08 04:04:21
只有两个主要的操作系统? – 2010-06-08 04:12:23
@JUST我正确的意见:'另外,你的用户地址空间图也是不完整的':怎么回事?我一直认为这是完整的。 &这怎么依赖于编译器?我认为这只取决于操作系统。 – claws 2010-06-08 06:00:39