2010-06-24 16 views
12

Actualmente estoy en proceso de realizar nuestra aplicación Large Address Aware. Como lo ha demostrado la experiencia, hay algunos inconvenientes inesperados al hacerlo. Creo esta publicación para hacer una lista completa de los pasos que deben tomarse.¿Qué hacer para que la aplicación de gran dirección esté al tanto?

Las consideraciones de desarrollo que figuran en la AMD Large Address Aware guide proporcionan un buen punto de partida, pero son de ninguna manera completa:

las siguientes consideraciones le ayudarán a asegurarse de que el código puede manejar direcciones de más de 2 GB:

  • Evite el uso de la aritmética del puntero con signo (es decir, compara y agrega)
  • Los punteros usan los 32 bits. No use Bit31 para otra cosa.
  • Algunos archivos DLL se cargarán justo debajo del límite de 2GB. En este caso, no se puede asignar memoria consecutiva con VirtualAlloc().
  • Siempre que sea posible, use GlobalMemoryStatusEx() (preferido) o GlobalMemoryStatus() para recuperar los tamaños de memoria.

Por lo tanto, la pregunta es: ¿Cuál es la lista completa de cosas que necesitan ser hechas al hacer C++ Win32 aplicación nativa grande Dirección Consciente?

Respuesta

22
  • (obvio) seleccione Soporte de Dirección más de 2 gigabytes (/ LARGEADDRESSAWARE) en las propiedades del proyecto: Enlazador/Sistema/Habilitar grande Dirección
  • cheque todos sustracciones puntero y verificar el resultado se almacena en un tipo que puede contener la diferencia posible, o reemplazarlos con comparaciones u otras construcciones - ver Detect pointer arithmetics because of LARGEADDRESSAWARE). Nota: la comparación del puntero debería estar bien, contrariamente a las recomendaciones de AMD, no hay razón por la cual debería causar problemas de 4 GB.
  • asegúrese de no estar asumiendo que los punteros tienen Bit31 cero, no intente utilizar Bit31 para otra cosa.
  • reemplazar todas las llamadas con GetCursorPos GetCursorInfo - ver GetCursorPos fails with large addresses
  • para todas las tareas en PVOID64 utilizar PtrToPtr64, por ejemplo, necesita al utilizar ReadFileScatter, consulte ReadFileScatter remark section
+0

"Eliminar todas las sustracciones del puntero" es excesivo. Los punteros dentro de una única matriz funcionan perfectamente bien. – MSalters

+0

@Suma: las adiciones de puntero NO están bien, ya que las adiciones de puntero pueden desbordarse cuando se establece 'LARGEADDRESSAWARE'. –

+0

además: tenga cuidado con las bibliotecas de terceros tratadas aquí: http://stackoverflow.com/questions/2288728/ – Opmet

Cuestiones relacionadas