Detectando tempo de compilation da arquitetura da CPU

Qual é a maneira mais confiável de descobrir a arquitetura da CPU ao compilar o código C ou C ++? Tanto quanto eu posso dizer, diferentes compiladores têm seu próprio conjunto de definições de pré-processador não padrão ( _M_X86 em MSVS, __i386__ , __arm__ no GCC, etc).

Existe uma maneira padrão de detectar a arquitetura que estou construindo? Se não, existe uma fonte para uma lista abrangente de tais definições para vários compiladores, como um header com todos os clichês #ifdef s?

Aqui estão algumas informações sobre macros de arquitetura predefinidas e outros tipos de macros predefinidas.

Esta questão pergunta onde eles estão definidos no código fonte do GCC.

Não há nenhum padrão inter-compilador, mas cada compilador tende a ser bastante consistente. Você pode construir um header para si mesmo, algo assim:

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

Não há muito sentido em uma lista abrangente, porque existem milhares de compiladores, mas apenas 3-4 em uso generalizado (Microsoft C ++, GCC, Intel CC, talvez TenDRA?). Apenas decida quais compiladores seu aplicativo suportará, liste seus #defines e atualize seu header conforme necessário.

Se você quiser despejar todos os resources disponíveis em uma plataforma específica, você pode executar o GCC como:

gcc -march=native -dM -E -

#define __SSE3__ 1 Marcos como #define __SSE3__ 1 , #define __AES__ 1 , etc.

Não há nada de padrão. Brian Hook documentou um monte deles em seu “Portable Open Source Harness”, e até tenta transformá-los em algo coerente e utilizável (ymmv em relação a isso). Veja o header posh.h neste site:

Note, o link acima pode exigir que você insira um ID de usuário falso / senha devido a um ataque do DOS há algum tempo.

Se você precisa de uma detecção refinada dos resources da CPU, a melhor abordagem é disponibilizar também um programa CPUID que produza stdout ou algum arquivo “cpu_config.h” o conjunto de resources suportados pela CPU. Em seguida, você integra esse programa ao seu processo de criação.