Ce n'est pas forcèment important dans tous les cas mais le x86-64 a des avantages de performance. Entre autres car il a plus de registres et pour des détails du genre de différences de convention d'appel ou simplement le fait de pouvoir faire des maths 64-bit nativement.
Pour certaines rares applications les performances peuvent empirer, surtout pour du vieux matos avec très peu de mémoire cache, car la taille des pointeurs double. À noter que pour palier ce problème il existe une ABI appelée x32 (à ne pas confondre avec le x32 sous Windows qui veut juste dire x86 en 32-bit), qui tourne avec le CPU en mode 64-bit mais utilise des pointeurs 32-bit, mais elle est pas particulièrement utilisée.
https://www.phoronix.com/scan.php?page=article&item=ubuntu-1710-x8664Quant au fait de porter des programmes en 64-bit: Généralement non c'est pas spécialement compliqué, mais il faut pouvoir mettre à jour les dépendances.
Cependant ce n'est pas tout, il peut y avoir des subtilités bêtes entre le 32-bit et le 64-bit. J'ai personnellement porté un jeu (dont je n'étais pas dév à la base) avec pas mal de code en 64-bit (pour raisons de performance et de tooling) et ce n'était pas une partie de plaisir. Il y a d'autres problèmes qu'on ne peut pas vraiment imaginer à l'avance, entre erreurs de compilation et comportements très étranges à l'exécution.
Quelques anecdotes dans ce cas pour rigoler même si c'est un peu HS, pour des choses que personne n'imaginerait vraiment:
- La lib de MD5 (probablement trouvée sur internet il y a plus de dix ans) s'attendait à ce que le type long soit 32-bit, mais en 64-bit il est en 64-bit, ce qui faussait le calcul... Bref, le symptôme était de ne pas pouvoir se connecter à des serveurs moddés car il retéléchargeait les mods en boucle puisque le MD5 différait.
- Lorsqu'on entrait en jeu, on tombait à travers le sol en permanence. Bref le bug qui ne semble n'avoir absolument rien à voir... J'ai trouvé à travers des heures de debugging ce que c'était: Une fonction de test de collision qui convertissait un pointeur d'un type en un autre sans aucune relation, et lisait un de ses champs (ce qui évidemment n'avait aucun sens car c'était pas le bon type). En 32-bit il lisait dans un pointeur, donc des données toujours non-nulles, mais en 64-bit il tombait dans du padding, c'est-à-dire des données qui tombaient toujours égales à zéro. La fonction était littéralement inutile mais retournait true en 32-bit et false en 64-bit, mais personne n'y avait prêté attention car ça ne posait pas problème à l'époque...
Bref oui, sur le papier ce n'est pas spécialement compliqué, mais il faut se dire que ça peut être infernal si on a une codebase horrible
