В 32-разрядной ОС процесс имеет адресное пространство 4 ГБ. всего .
. В Windows половина этого объема запрещена, поэтому ваш процесс имеет 2 ГБ.
Это 2 ГБ непрерывной памяти.Но это становится фрагментированным.Ваш исполняемый файл загружается по одному адресу, каждая DLL загружается по другому адресу, затем есть стек, выделения кучи и так далее.Таким образом, хотя ваш процесс, вероятно, имеет достаточно свободного адресного пространства, нет непрерывных блоков, достаточно больших для выполнения ваших запросов памяти.Таким образом, выделение меньших ресурсов, вероятно, решит эту проблему.
Если ваше приложение скомпилировано с флагом LARGEADDRESSAWARE, ему будет разрешено использовать столько же оставшихся 2 ГБ, сколько может сэкономить Windows.(И значение этого зависит от вашей платформы и среды.
- для 32-разрядного кода, работающего на 64-разрядной ОС, вы получите полное 4-ГБ адресное пространство
- для 32-битного кода, работающего на 32-битной ОС без переключателя загрузки / 3GB, флаг вообще ничего не значит
- для 32-битного кода, работающего на 32-битной ОС с загрузкой / 3GBЕсли вы переключитесь, вы получите 3 ГБ адресного пространства.
На самом деле, установка флага - это всегда хорошая идея, если ваше приложение может с ним справиться (это в основном флаг возможностей. Он сообщает Windows, что мы можем обрабатывать больше памяти, поэтому, если Windows тоже может, она должна просто пойти дальше и предоставить нам как можно больше адресного пространства), но вы, вероятно, не можете полагаться на то, что это даст эффект.на 64-битной ОС маловероятно, что вы будете много покупать. (Требуется переключатель загрузки / 3GB, и известно, что он вызывает проблемы с драйверами, особенно с видеодрайверами)