32 votes

En tant que programmeur, de quoi dois-je m'inquiéter lors du passage à des fenêtres 64 bits?

La plupart de mes récentes de la programmation a été sur Windows 32 bits à l'aide de C/C++/C#/VB6 . Dernièrement, ce sont mes clients me demandant si mon code sera exécuté sur Windows 64 bits.

Je me demandais quel héritage les fonctionnalités que j'ai peut-être l'aide qui va briser sur une version 64 bits de Windows? Quels sont certains des problèmes du monde réel j'ai besoin de réfléchir et de s'inquiéter?

Évidemment, je vais tester mon code sur le système d'exploitation 64 bits, mais j'aimerais savoir ce que des questions communes à rechercher. Je me préoccupe davantage de l'existant binaires, mais je suis ouvert aux commentaires au sujet de quoi s'inquiéter lors de la recompilation (si possible).

EDIT: Voici une belle liste de 64 bits portage de bugs.

22voto

bk1e Points 13737

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).

4voto

Gulzar Nazim Points 35342

Il pourrait être plus facile de migrer .NET code si vous avez 100% de type "coffre-fort de code managé". Vous pouvez simplement copier de la plate-forme 64 bits et exécuter avec succès sous la version 64 bits du CLR. Cochez cette MSDN lien sur la migration des 32 bits de code Managé à 64 bits.

Btw,, hanselman blogué sur le sujet récemment.

2voto

Andrew Grant Points 35305

Si vous parlez des programmes 32 bits, alors vous avez pratiquement rien à craindre depuis Windows 64 va les exécuter dans l'émulation 32 bits. Aucun problème avec les futures versions de Windows (e.g Windows 7) sont susceptibles d'être des incompatibilités plutôt que des problèmes avec un OS 64 bits.

Toutefois, si votre code managé est compilé pour la "any CPU" plate-forme cible et vous faire des appels dans le code non managé (e.g PInvoke), ou dépendent d'autres assemblées, puis il ya certaines choses à connaître. Scott, Hanselman du post sur le x86/x64 CLR couvre ce et est une bonne explication de la CLR sur Win32/64.

Lors de l'élaboration de programmes natifs 64 bits puis le Guide de Programmation pour la version 64 bits de Windows est un bon guide. Il provient en grande partie vers le bas pour les pointeurs et la taille des types de données :)

2voto

nusi Points 730

32bit programmes fonctionnent très bien sur une version 64 bits de windows. Tant que vous ne faites pas tout pilote de périphérique type de développement de cours.

Si vous compilez votre logiciel en 64 bits du logiciel la première fois, vous devez prendre soin de la suivante:

  • un pointeur est une version 64 bits de large, tandis qu'un int est de 32 bits. Ne pas stocker des pointeurs dans ints, votre code de casser.
  • 64 bits processus 64 bits Dll. Si vous dépendez de la troisième partie de Dll, assurez-vous qu'ils sont aussi disponibles en 64 bits. Si vous avez besoin de communiquer entre un processus 32 bits et 64 bits, vous aurez besoin de certains de beaucoup de différentes manières de la CIB sur Windows. L'appel de fonctions directement est hors de question.
  • Le système de répertoires sur une version 64 bits de Windows sont différents de ceux de 32 bits de Windows. Si vous avez quelques chemins codés en dur, vous devrez peut-être vérifier de nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X