Использование IMAGE_FILE_LARGE_ADDRESS_AWARE 32 бита - 64 бита - PullRequest
2 голосов
/ 20 октября 2010

Вчера я узнал, что в 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 ]

4 голосов
/ 20 октября 2010

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

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

1 голос
/ 21 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...