Что нужно сделать, чтобы приложение Large Address Aware? - PullRequest
14 голосов
/ 24 июня 2010

В настоящее время я работаю над созданием нашего приложения Large Address Aware. Как показал опыт, при этом возникают некоторые неожиданные ошибки. Я создаю этот пост, чтобы составить полный список шагов, которые необходимо предпринять.

Соображения по разработке, перечисленные в Руководстве по распознаванию больших адресов AMD , дают хорошую отправную точку, но ни в коем случае не являются полными:

Следующие соображения помогут убедиться, что код может обрабатывать адреса размером более 2 ГБ:

  • Избегайте использования арифметики со знаковыми указателями (т.е. сравнивает и добавляет)
  • Указатели используют все 32-битные. Не используйте Bit31 для чего-то другого.
  • Некоторые библиотеки DLL будут загружены только под границей 2 ГБ. В этом случае последовательная память не может быть выделена с помощью VirtualAlloc ().
  • По возможности используйте GlobalMemoryStatusEx () (предпочтительно) или GlobalMemoryStatus () для получения размеров памяти.

Поэтому возникает вопрос: Каков полный список того, что необходимо сделать при создании собственного приложения C ++ Win32 Large Address Aware?

1 Ответ

24 голосов
/ 24 июня 2010
  • (очевидно) выберите адрес поддержки, превышающий 2 гигабайта (/ LARGEADDRESSAWARE) в свойствах проекта: Linker / System / Enable Large Address
  • проверьте все вычитания указателя и убедитесь, что результат сохраняется втип, который может содержать возможные различия, или заменить их сравнениями или другими конструкциями - см. Обнаружение арифметики указателя из-за LARGEADDRESSAWARE ).Примечание: сравнение указателей должно быть в порядке, вопреки советам AMD, нет причин, по которым оно должно вызывать проблемы 4 ГБ
  • Убедитесь, что вы не предполагаете, что указатели имеют бит 31, ноль, не пытайтесь использовать бит 31 для чего-то другого.
  • заменить все вызовы GetCursorPos на GetCursorInfo - см. Сбой GetCursorPos с большими адресами
  • для всех назначений в PVOID64 используйте PtrToPtr64, необходимый, например, при использовании ReadFileScatter, см. Раздел замечаний ReadFileScatter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...