2010-06-24 16 views
12

Jestem obecnie w trakcie tworzenia naszej aplikacji Large Address Aware. Jak pokazało doświadczenie, pojawiają się nieoczekiwane błędy. Tworzę ten post, aby utworzyć pełną listę kroków, które należy podjąć.Co zrobić, aby aplikacja Large Address Aware?

Rozważania rozwojowe wymienione w AMD Large Address Aware guide stanowić dobry punkt wyjścia, ale nie są bynajmniej Complete:

następujące rozważania pomogą, aby upewnić się, że kod może obsługiwać adresy większe niż 2 GB:

  • Unikaj stosowania arytmetyki ze wskaźnikami (np. Porównuj i dodaje)
  • Wskaźniki używają wszystkich 32-bitów. Nie używaj Bit31 do czegoś innego.
  • Niektóre biblioteki dll zostaną załadowane tuż pod granicą 2GB. W takim przypadku żadna kolejna pamięć nie może zostać przydzielona za pomocą VirtualAlloc().
  • Gdy tylko jest to możliwe, użyj funkcji GlobalMemoryStatusEx() (preferowane) lub GlobalMemoryStatus(), aby pobrać rozmiary pamięci.

Zatem pytanie brzmi: Co znajduje się pełna lista rzeczy, które muszą być wykonane podczas dokonywania C++ Win32 natywna aplikacja Large Address Aware?

Odpowiedz

22
  • (oczywiste) wybierz Pomoc Adres większych niż 2 GB (/ LARGEADDRESSAWARE) we właściwościach projektu: Linker/system/włączyć duże adres
  • sprawdzanie wszystkich odejmowanie wskaźnik i zweryfikować wynik jest przechowywany w rodzaju, który może zawierać ewentualną różnicę lub zastąpić je porównaniami lub innymi konstrukcjami - patrz Detect pointer arithmetics because of LARGEADDRESSAWARE). Uwaga: porównanie wskaźników powinno być w porządku, wbrew zaleceniom AMD, nie ma powodu, dla którego powinno powodować problemy z 4 GB.
  • Upewnij się, że nie zakładasz, że wskaźniki mają bitę zero zero, nie próbuj używać Bit31 do czegoś innego.
  • Zamień wszystkie połączenia GetCursorPos z GetCursorInfo - patrz GetCursorPos fails with large addresses
  • dla wszystkich przydziałów do PVOID64 użyj PtrToPtr64, potrzebnych np. podczas korzystania z ReadFileScatter, zobacz ReadFileScatter remark section
+0

"Wyeliminuj wszystkie odejmowania wskaźnika" jest nadmierne. Wskaźniki w pojedynczej macierze działają doskonale. – MSalters

+0

@Suma: dodatki po wskaźnikach NIE są w porządku, ponieważ dodanie kursora może zostać przepełnione po ustawieniu 'LARGEADDRESSAWARE'. –

+0

ponadto: uważaj na biblioteki innych firm omówione tutaj: http://stackoverflow.com/questions/2288728/ – Opmet

Powiązane problemy