Détecter l'architecture du système (x86 / x64) en cours d'exécution
-
06-07-2019 - |
Question
Est-il possible de détecter l'architecture système / processeur lorsque le programme est en cours d'exécution (sous Windows et sous Linux) en c ++?
La solution
Sous Windows, vous pouvez utiliser < code> __ cpuid . Sous Linux, vous pouvez ouvrir ("/ proc / cpuinfo")
et le parcourir.
Voici un exemple sous Windows, basé sur l'exemple du page MSDN :
#include <intrin.h>
bool cpuSupports64()
{
int CPUInfo[4];
__cpuid(CPUInfo, 0);
return (CPUInfo[3] & 0x20000000) || false;
}
Autres conseils
Sous Linux, vous pouvez utiliser l'appel système uname
. Il remplit cette structure allouée par l'utilisateur:
struct utsname { char sysname[]; /* Operating system name (e.g., "Linux") */ char nodename[]; /* Name within "some implementation-defined network" */ char release[]; /* OS release (e.g., "2.6.28") */ char version[]; /* OS version */ char machine[]; /* Hardware identifier */ #ifdef _GNU_SOURCE char domainname[]; /* NIS or YP domain name */ #endif };
Le champ machine
identifiera l'architecture.
En fonction de l'utilisation que vous envisagez de faire avec ces informations (par exemple, sélectionnez le code d'assemblage codé à la main le plus rapide pour un processeur spécifique), sous Linux, vous souhaiterez peut-être lire / proc / cpuinfo, en particulier: les "drapeaux". section, vous pouvez donc choisir entre la mise en œuvre SSE / SSE2 ou la mise en oeuvre MMX ou autre.
Le système Big Endian par rapport au système Little Endian est un peu plus compliqué. Voir http: //. en.wikipedia.org/wiki/Endianess