Pour autant que je suis concerné, la chose la plus importante sur le portage de code C/C++ pour Windows 64 bits est de tester votre application avec MEM_TOP_DOWN
des allocations de permis (AllocationPreference
de la valeur de registre) comme décrit dans 4 Gigaoctets de Réglage:
À force d'allocations d'allouer de la hausse des adresses avant de baisser les adresses des fins de test, spécifiez MEM_TOP_DOWN
lors de l'appel d' VirtualAlloc
ou définir la valeur de registre suivante pour 0x100000:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference
Quand est-ce important?
- Si vous avez 32-bit Exe qui ont été construits avec l'
/LARGEADDRESSAWARE
MSVC option de l'éditeur de liens (ou qui ont l' IMAGE_FILE_LARGE_ADDRESS_AWARE
indicateur dans leur PE-têtes par d'autres moyens, tels que l' editbin.exe
), puis ils obtiennent un complet de 4 GO d'espace d'adressage virtuel dans Windows 64 bits, et vous devez les tester avec l' AllocationPreference
valeur de registre la valeur.
- Si vous avez des Dll 32 bits qui peut être chargé par le grand adresse conscient Exe, vous devez les tester avec l'
AllocationPreference
valeur de registre la valeur.
- Si vous recompilez votre code C/C++ dans un 64-bit EXE ou DLL, vous devez le tester avec l'
AllocationPreference
valeur de registre la valeur.
Si votre application C/C++ tombe dans une de ces trois catégories, et vous n'avez pas fait de test avec MEM_TOP_DOWN
des allocations, le test est très rare d'attraper n'importe quel pointeur de la troncature/ce paramètre bugs dans votre code.
La deuxième chose la plus importante, si vous utilisez MSVC et vous êtes à la recompilation de code C/C++ pour la version 64 bits, est d' utiliser l' /Wp64
option de compilateur pour votre 64-bit build:
- Cela va entraîner le compilateur d'émettre des avertissements pour typecasts qui tronquent les pointeurs ou d'étendre les petits types intégraux dans les pointeurs (même lors de la
reinterpret_cast
C-style fonte est utilisée), ainsi que quelques autres 64 bits problèmes de portage.
- Oui, la documentation dit que la place de la compilation avec
/Wp64
vous devez utiliser un compilateur qui cible une plate-forme 64 bits, mais qui ne suffiront pas à rattraper le pointeur de la troncature et les questions d'extension au moment de la compilation. À l'aide d'un compilateur qui cible 64 bits et l'activation de l' /Wp64
option de compilation pour les 64 bits sera en mesure de capturer le pointeur de la troncature et les questions d'extension au moment de la compilation, et cela vous fera économiser temps dans le long terme.
- Malheureusement, avec MSVC 2008, cela permettra également de produire une "ligne de commande avertissement" pour chaque unité de traduction de dire que l'
/Wp64
option est obsolète. Je peux voir pourquoi l'option est déconseillée pour les versions 32 bits (où il est un mal hack qui nécessite l'annotation d'un grand nombre de vos typedefs), mais c'est dommage qu'il est également déconseillé pour les versions 64 bits (où il est vraiment utile).