95 votes

Détection de l'architecture de l'unité centrale au moment de la compilation

Quel est le moyen le plus fiable de connaître l'architecture du processeur lors de la compilation d'un code C ou C++ ? Pour autant que je sache, les différents compilateurs ont leur propre ensemble de définitions de préprocesseur non standard ( _M_X86 dans MSVS, __i386__ , __arm__ dans GCC, etc.)

Existe-t-il un standard de détecter l'architecture pour laquelle je construis ? Si ce n'est pas le cas, existe-t-il une source pour une liste complète de ces définitions pour différents compilateurs, comme un en-tête avec tous les éléments de base #ifdef s ?

1 votes

La réponse est fondamentalement la même pour la détection du système d'exploitation : stackoverflow.com/questions/142508/

0 votes

81voto

Serge Points 4480

Voici quelques informations sur Macros d'architecture prédéfinies et d'autres types de macros prédéfinies.

Cette question demande où ils sont définis dans le code source de GCC.

0 votes

La norme C ou C++ définit-elle des macros suggestives à utiliser par les différents compilateurs ?

0 votes

Cela semble correct, mais quelqu'un peut-il citer la documentation de GCC qui dit qu'il l'utilise ?

21voto

John Millikin Points 86775

Il n'existe pas de norme inter-compilateurs, mais chaque compilateur tend à être assez cohérent. Vous pouvez vous créer un en-tête qui ressemble à ceci :

#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif

Une liste exhaustive n'a pas beaucoup de sens, car il existe des milliers de compilateurs, mais seulement 3-4 sont largement utilisés (Microsoft C++, GCC, Intel CC, peut-être TenDRA ?). Il suffit de décider quels compilateurs votre application supportera, de lister leurs #defines, et de mettre à jour votre en-tête si nécessaire.

4 votes

Cela n'a pas fonctionné pour moi avec Visual Studio 2010. _M_X86 n'a pas été définie (version 32 bits). La version correcte est _M_IX86 (crédit au lien de Serge ci-dessus).

0 votes

Fonctionnent-ils sur les x86 32 bits et 64 bits ?

3voto

Michael Burr Points 181287

Il n'y a rien de standard. Brian Hook en a documenté un certain nombre dans son "Portable Open Source Harness", et tente même d'en faire quelque chose de cohérent et d'utilisable (ymmv en ce qui concerne cela). Voir l'en-tête posh.h sur ce site :

Notez que le lien ci-dessus peut vous demander d'entrer un faux nom d'utilisateur/mot de passe à la suite d'une attaque DOS il y a quelque temps.

2 votes

Jeez - désolé pour le faux lien - il devrait être à hookatooka.com/poshlib qui donne des informations sur l'identifiant et le mot de passe. Mon navigateur a dû se connecter automatiquement lors d'une précédente visite de la page.

2 votes

Il convient également de noter... Les auteurs du site ont expliqué pourquoi ils ont ajouté un mot de passe : "Je m'excuse pour la gêne occasionnée, mais en raison d'une attaque DDoS inexplicable sur notre lien direct précédent, nous avons dû créer cette page pour 'faire tampon' contre le DDoS..." Je ne suis pas sûr qu'il soit juste de pénaliser Michael pour cela.

0voto

Tõnu Samuel Points 1133

GCC dispose de l'option -march=native qui permet d'affiner tous les arguments possibles du compilateur. Mais attention, il n'est pas supporté par de nombreux ports de GCC, par exemple ARM et IOS.

-3voto

zvrba Points 14028

Si vous avez besoin d'une détection fine des caractéristiques du processeur, la meilleure approche consiste à fournir également un programme CPUID qui affiche sur stdout ou dans un fichier "cpu_config.h" l'ensemble des caractéristiques prises en charge par le processeur. Vous intégrez ensuite ce programme à votre processus de construction.

4 votes

Ne fonctionne pas pour la compilation croisée. Et comment compiler un programme cpuid sans savoir sur quelle machine il doit s'exécuter ?

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