Detectar arquitetura do sistema (x86 / x64) durante a execução
-
06-07-2019 - |
Pergunta
É possível detectar a arquitetura do sistema / processador enquanto o programa é em execução (no Windows e no Linux) em c ++?
Solução
No Windows, você pode usar __cpuid
. No Linux, você pode open("/proc/cpuinfo")
e olhar através dele.
Aqui está um exemplo no Windows, com base no exemplo na rel página MSDN :
#include <intrin.h>
bool cpuSupports64()
{
int CPUInfo[4];
__cpuid(CPUInfo, 0);
return (CPUInfo[3] & 0x20000000) || false;
}
Outras dicas
No Linux, você pode usar a chamada de sistema uname
. Ele preenche esta estrutura alocada pelo usuário:
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 };
O campo machine
irá identificar a arquitetura.
Dependendo do que você pretende fazer com esta informação (por exemplo, selecionar o código de montagem mais rápida handcoded para um CPU específico), no Linux você pode querer ler o / proc / cpuinfo, especificamente: a seção "bandeiras", para que você possa escolher entre a implementação SSE / SSE2 vs. MMX implementação vs. o que quer.
sistema endianBig vs. pequeno sistema endian é um pouco mais complicado, consulte: http: // en.wikipedia.org/wiki/Endianess