На мой взгляд, есть еще один малоизвестный факт о границе 2 ГБ. Многие приложения обычно работают с большим количеством арифметики с указателями (особенно приложения, написанные на C, C ++, ...). В этих приложениях довольно часто добавляют смещения к указателям или даже вычитают указатели.
Если доступное виртуальное адресное пространство составляет 2 ГБ, вам гарантировано, что вычитание двух указателей всегда находится между -2147483647 и +2147483648 (это ограничения для 32-разрядных значений со знаком).
Если ваше адресное пространство будет 3 ГБ, возможная разница будет больше, чем любое значение, которое может быть представлено в 32-разрядном значении со знаком.
Если вы знаете, что ваше приложение безопасно и не вычитает полностью несвязанные указатели (и ваши массивы меньше 2 ГБ!), Вы можете указать Windows, что ваше приложение может работать с адресным пространством, превышающим 2 ГБ, установив компоновщик пометьте LARGEADDRESSAWARE (или установите это с помощью утилиты EDITBIN).
С XP (не совсем уверен в Vista и W7) вы можете загрузиться в режиме, где «пространство ядра» составляет всего 1 ГБ, а 3 ГБ в виртуальном адресном пространстве оставлено для приложения. Если ваше приложение LARGEADDRESSAWARE, вы получите все 3 ГБ. Если нет, вы получите только 2 ГБ.
В 64-разрядных Windows 32-разрядные приложения LARGEADDRESSAWARE даже получают 4 ГБ, поскольку Windows не требуется значительного адресного пространства в 32-разрядной области (в конце концов, это 64-разрядная ОС).