Affichage des articles dont le libellé est development. Afficher tous les articles
Affichage des articles dont le libellé est development. Afficher tous les articles

vendredi 12 juin 2009

64 bits ou 32 bits: mon petit programme print-sizeof-pointer.c

Comme je viens de m'offrir un PC de bureau 64-bit, je m'intéresse aux différences entre 64-bit et 32-bit.

J'ai donc écrit un tout petit programme en C qui permet de connaître la taille des pointeurs:

/*
print-sizeof-pointer.c

This little program prints the size of pointers.
On a 64-bit system, pointers are 64-bit (8 bytes),
so this program prints "8".
On a 32-bit system, pointers are 32-bit (4 bytes),
so this program prints "4".

Pierre Bauduin
le 12 juin 2009 */

#include <stdio.h>
int main()
{
printf ("print-sizeof-pointer.c\n");
printf (" If the result is 8, this machine is a 64-bit system.\n");
printf (" If the result is 4, this machine is a 32-bit system.\n");
printf (" Result: %d\n", sizeof(void *));
}


Ce programme permet donc de savoir si l'adressage est 64-bit ou 32-bit.
Si la taille des pointeurs est 8 octets, cela veut dire que l'adressage est 64-bit.
Si la taille des pointeurs est 4 octets, cela veut dire que l'adressage est 32-bit.

Attention, évitons les confusions:
  • Sur une machine 64-bit on peut faire tourner un OS 64-bit ou un OS 32-bit. Si l'OS est 32-bit, l'adressage est 32-bit.
  • Même si la machine et l'OS sont tous les deux 64-bit, cela ne veut pas dire que tous les exécutables doivent être 32-bit ou 64-bit. Par exemple avec Mac OS X 10.5 "Léopard", une grande majorité des exécutables est encore 32-bit.
  • Et donc, sur une machine 64-bit avec un OS 64-bit, il est généralement possible de faire tourner à la fois des exécutables 64-bit et des exécutables 32-bit.
  • C'est en fait c'est à la compilation (voir ci-dessous comment) qu'il est possible de choisir de générer un exécutable 32-bit ou 64-bit.

Comment compiler une version 64-bit et/ou 32-bit ?

Si vous avez un système 64-bit, il est possible de dire au compilateur de générer un exécutable 32-bit ou 64-bit.

Cas de Linux, FreeBSD et Solaris:
Pour compiler en 64-bit:
gcc -o print-sizeof-pointer-solaris-64bit.bin -m64 print-sizeof-pointer.c
Pour compiler en 32-bit:
gcc -o print-sizeof-pointer-solaris-32bit.bin -m32 print-sizeof-pointer.c

Cas de Mac OS X: Comme expliqué dans un post précédent, MacOSX permet de générer des "universal binaries" qui contiennent dans le même fichier les exécutables pour une, deux, trois ou même quatre architectures:
gcc -arch i386 -arch ppc -arch ppc64 -arch x86_64 -o print-sizeof-pointer.bin print-sizeof-pointer.c