Подтвердить что ты не робот

Что делать, чтобы сделать приложение "Большой адрес"?

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

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

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

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

Таким образом, возникает вопрос: Каков полный список вещей, которые необходимо выполнить при создании собственного приложения С++ Win32? Большой адрес Aware?

4b9b3361

Ответ 1

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