{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} не работает в моем приложении

У меня есть приложение win32, построенное с пакетами времени выполнения. Я разрешаю {$ SetPEFlags var A , B : TBytes ; процедура TForm60 . Button1Click ( Отправитель : TObject ); begin SetLength ( A , 1024 * 1024 * 1024 ); SetLength ( B , 1024 * 1024 * 1024 ); конец ; } в моем .dpr файле. Я предполагаю, что исполняемый файл должен иметь установленный флаг.

Затем я тестирую выделение этой памяти:

Out of memory

и я получаю IMAGE_FILE_LARGE_ADDRESS_AWAREошибку. Я также убеждаюсь, что память времени выполнения для приложения была меньше 100M. Он должен быть ниже 3 ГБ.

Моя среда исполнения - Windows 10 v1803, RAD Studio 10.2 Tokyo release 3. В приложении используется несколько сторонних .bpl.

Я пробую пример проекта, и IMAGE_FILE_LARGE_ADDRESS_AWAREфлаги работают как ожидалось. Без IMAGE_FILE_LARGE_ADDRESS_AWAREвышеуказанного кода сбой Out of memoryи работа с установленным флагом.

Есть ли какие-либо шаги, которые я исказил для своего приложения?

delphi,

0

Ответов: 1


1

Я предполагаю, что исполняемый файл должен иметь установленный флаг.

Лучше проверьте это с помощью инструмента, например, vmmapиз пакета sysinternals.

Но фрагментация памяти может не разрешать два блока размером 1 ГБ, даже если приложение имеет 4 ГБ адресного пространства. Самый большой свободный блок ниже 2 ГБ, как правило, немного меньше, чем один ГБ, и выше 2 ГБ обычно есть небольшой материал, который мешает вам выделить все это.

Обратите внимание, что в управлении кучей есть некоторые накладные расходы - ваши 1 ГБ блоки действительно потребуют 1 ГБ плюс пару байт свободного места.

Дельфы,
Похожие вопросы