Что делать, чтобы сделать приложение "Большой адрес"?
В настоящее время я нахожусь в разработке нашего приложения Large Address Aware. Как показал опыт, при этом возникают неожиданные ошибки. Я создаю этот пост, чтобы составить полный список шагов, которые необходимо предпринять.
Рекомендации по разработке, перечисленные в руководстве AMD Large Address Aware, являются хорошей отправной точкой, но отнюдь не полны:
Следующие соображения помогут убедиться, что код может обрабатывать адреса размером более 2 ГБ:
- Избегайте использования арифметики подписанных указателей (I.e. сравнивает и добавляет)
- Указатели используют все 32 бита. Не используйте бит31 для чего-то еще.
- Некоторые DLL будут загружены только под границей 2 ГБ. В этом случае никакая последовательная память не может быть выделена с помощью VirtualAlloc().
- По возможности используйте GlobalMemoryStatusEx() (предпочтительно) или GlobalMemoryStatus() для извлечения размеров памяти.
Таким образом, возникает вопрос: Каков полный список вещей, которые необходимо выполнить при создании собственного приложения С++ Win32? Большой адрес Aware?
Ответы
Ответ 1
- (очевидно) выберите в адресе проекта более 2 гигабайт (/LARGEADDRESSAWARE) в свойствах проекта: Linker/System/Enable Large Address
- проверить все вычитания указателя и проверить, что результат сохранен в типе, который может содержать возможную разницу, или заменить их сравнением или другими конструкциями - см. Обнаружение арифметики указателей из-за LARGEADDRESSAWARE). Примечание: сравнение указателей должно быть хорошим, вопреки совету AMD, нет причин, по которым он должен вызывать проблемы с 4 ГБ.
- убедитесь, что вы не предполагаете, что указатели имеют бит31, но не пытайтесь использовать бит31 для чего-то другого.
- заменить все вызовы GetCursorPos с помощью GetCursorInfo - см. GetCursorPos с большими адресами
- для всех назначений в PVOID64 используйте PtrToPtr64, необходимые, например. при использовании ReadFileScatter см. Раздел примечаний ReadFileScatter