Использование IMAGE_FILE_LARGE_ADDRESS_AWARE 32 бита - 64 бита

Вчера я узнал, что в DelphiXE используется директива компилятора:

{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

вы можете получить доступ к 4 ГБ адресного пространства на 64-битных компьютерах, даже если компилятор DelphiXE создает 32-битный код.

Я попробовал сегодня программу DelphiXE на 4 ГБ машине с Windows7 и после запуска программы я действительно получаю следующий результат:

  • Кбайт физической памяти: ~4.000.000KB
  • Кбайт свободной физической памяти: ~3.200.000KB
  • Процент используемой памяти: ~20%
  • Кбайт виртуального адресного пространства: ~4.000.000KB¨
  • Кбайт свободного виртуального адресного пространства: ~4.000.000KB

Каждый раз после загрузки нескольких объектов (таблиц, строк, списков, множества указателей) объем свободной памяти уменьшается, что нормально, пока вся память не используется. Все в порядке. Но вот несколько вопросов:

1. Иногда я слышал, что программа использует жесткий диск вместо ОЗУ, потому что он замедляется (но память все еще доступна). Это возможно? Если да, как запретить программе использовать диск, когда ОЗУ еще доступно? Или, может быть, некоторые временные файлы записываются на диск?

  1. Что произойдет с той же программой на машине с 8G Ram? Сможет ли 32-битная программа использовать все 8G? Я полагаю, что нет, поскольку указатели имеют только 32 бита, и существует ограничение на доступ к ним.

  2. Если бы я скомпилировал ту же программу на 64-битной машине с 64-битным компилятором (что пока что невозможно, к сожалению), я предполагаю, что на машине с 4GRam 64-битная программа будет иметь меньше свободного места в ОЗУ, чем 32-битная программа с включенной IMAGE_FILE_LARGE_ADDRESS_AWARE, потому что указатели являются 64-битными, и поэтому они одни занимали больше места, чем 32-битные указатели. Я думаю совершенно неправильно?

Спасибо за любой ответ.

2 ответа

Да, операционная система заменит части вашей виртуальной памяти (то, что вы называете ОЗУ) в файл подкачки, если решит, что это необходимо.

32-разрядная программа не сможет использовать более 4 ГБ (даже в 64-разрядной Windows), и, наконец, собственная 64-разрядная программа не будет использовать больше памяти, чем 32-разрядная программа из-за размера указателя (внутренне 32-разрядный указатель равен 64). битовые указатели в x64 windows).

И примечание: если вы установили переключатель Large Address Aware, вы должны быть уверены, что ваше приложение (которое включает в себя vcl, модули delphi и компоненты) может обрабатывать адреса> 2 ГБ. Например, приведение указателя к Integer - это то, что не разрешено. Конечно, есть и другие подводные камни.

64-битные приложения используют больше памяти, чем 32-битные, потому что некоторые типы данных будут иметь 64-битную длину вместо 32 (не только указатели - и это зависит от того, какие типы данных используются вашими приложениями и стандартными типами компилятора). Кроме того, некоторые инструкции могут требовать кодирования большего количества байтов. Поскольку строки UTF-16 требуют больше места, чем строки ANSI. Конечно, если вам приходится манипулировать большими 64-битными структурами, не стоит использовать 64-битную машину только с 4 ГБ ОЗУ. Одной из причин использования 64-битной ОС является управление более 4 ГБ без использования трюка с разбиением на страницы.

Другие вопросы по тегам