從您的問題或圖像中不完全清楚,但使用「系統地址空間」可能意味着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