Detección de arquitectura de CPU en tiempo de compilación


¿Cuál es la forma más fiable de descubrir la arquitectura de la CPU al compilar código C o C++? Por lo que puedo decir, diferentes compiladores tienen su propio conjunto de definiciones de preprocesador no estándar (_M_X86 en MSVS, __i386__, __arm__ en el CCG, etc.).

¿Hay una forma estándar de detectar la arquitectura para la que estoy construyendo? Si no es así, ¿hay una fuente para una lista completa de tales definiciones para varios compiladores, como un encabezado con todas las repeticiones #ifdef?

Author: Martin York, 2008-09-30

5 answers

Aquí hay información sobre Macros de Arquitectura predefinidas y otros tipos de macros predefinidas.

Esta pregunta pregunta dónde están definidos en el código fuente de GCC.

 64
Author: Serge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 22:43:29

No hay un estándar entre compiladores, pero cada compilador tiende a ser bastante consistente. Puedes construir un encabezado por ti mismo que sea algo como esto:

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

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

No hay mucho sentido para una lista completa, porque hay miles de compiladores, pero solo 3-4 en uso generalizado (Microsoft C++, GCC, Intel CC, tal vez TenDRA?). Simplemente decida qué compiladores soportará su aplicación, enumere sus #defines y actualice su encabezado según sea necesario.

 14
Author: John Millikin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-30 07:03:40

Si desea volcar todas las funciones disponibles en una plataforma en particular, puede ejecutar GCC como:

gcc -march=native -dM -E - </dev/null

Dejaría a Marcos como #define __SSE3__ 1, #define __AES__ 1, etc.

 3
Author: Wei Shen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-04 04:07:32

No hay nada estándar. Brian Hook documentó un montón de estos en su "Arnés de Código Abierto Portátil", e incluso intenta convertirlos en algo coherente y utilizable (ymmv con respecto a eso). Mira el pijo.h cabecera en este sitio:

Tenga en cuenta que el enlace anterior puede requerir que ingrese algún id de usuario/contraseña falso debido a un ataque DOS hace algún tiempo.

 2
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-09 21:20:47

Si necesita una detección detallada de las características de la CPU, el mejor enfoque es enviar también un programa CPUID que emita a stdout o algún "cpu_config.h " archivo el conjunto de características soportadas por la CPU. Luego integras ese programa con tu proceso de compilación.

 -2
Author: zvrba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-30 14:41:30