Points à prendre en considération pour le code d'écriture qui est portable aux deux architectures 32 et 64 bits

StackOverflow https://stackoverflow.com/questions/2254222

  •  20-09-2019
  •  | 
  •  

Question

Quels sont les points qui doivent être gardés à l'esprit tout à écrire du code qui devrait être portable sur les deux 32 bits et 64 bits machines?

En pensant plus à ce sujet, je me sens si vous pouvez ajouter votre expérience interms des problèmes rencontrés, cela aiderait.

Ajout plus loin, je une fois face à un problème en raison d'un prototype manquant pour une fonction qui revenait de retourner un pointeur. Lorsque j'ai porté même à une machine 64 bits, le code plantait et je n'avais pas la moindre idée de la raison pour un certain temps, réalisé plus tard que tous les prototypes manquants sont supposés revenir int la cause du problème.

Tous ces exemples peuvent aider.

EDIT:. Ajoutant à la communauté wiki

Était-ce utile?

La solution

Gotchas:

  1. pointeurs de Castings types entiers est dangereux
  2. taille de la structure de données peuvent changer
  3. Attention pour l'extension du signe
  4. Une autre ABI?

Quelques conseils et astuces j'ai trouvé utile:

  1. Procurez-vous un type entier de taille native (à partir d'un en-tête ou typedef votre propre) et de l'utiliser lorsque vous avez des variables qui ne se soucient pas de la taille.
  2. Utiliser les types de variables explicites chaque fois que possible (u_int64_t, int_32_t, etc.)

Autres conseils

  • Certains types entiers peuvent avoir des tailles différentes
  • Les pointeurs sont de longueurs différentes
  • Rembourrage Structure
  • Alignement

Sur Windows, il appelle convention uniquement sur x64 par opposition au multiple sur une machine x32 régulière.

Les choses se quand vous avez plus trouble des composants qui sont 32 bits et une 64 bits. Sous Windows, je fini par écrire un service COM pour les amener à parler.

Pousser des pointeurs sur la pile prend l'espace deux fois plus. taille de la pile ne peut pas changer entre OS versions bien, le code faisant que fonctionne très bien en 32 bits à l'échec mystérieusement fois compilé et exécuté sans changement sur 64 bits. Ne me demandez pas comment je le sais.

sizeof (int) peut! = Sizeof (void *)

alignement

. Il est possible que les alignements besoins pourraient changer. Cela peut révéler des bogues où vous avez des choses Maltraiter qui auraient dû être alignés, mais n'ont été alignées par hasard en 32 bits (ou sur un processeur qui ne marche pas soin)

0 DonT passe dans varargs si le récepteur attend un pointeur. Ceci est douloureux en C ++ où avertis devs savent que 0 est un pointeur NULL valide. Un C dev utilisera généralement NULL si vous êtes probablement OK

Rédiger des tests automatisés et de les exécuter régulièrement sur les deux plates-formes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top