检测CPU结构的编写时间
-
02-07-2019 - |
题
什么是最可靠的方法,以找出CPU结构时,汇编C或C++编码吗?我可以告诉,不同的编纂者有他们自己设定的非标准的预处理器定义(_M_X86
在MSVS, __i386__
, __arm__
在海湾合作委员会等)。
是有一个 标准 方式检测结构,我是建筑用的?如果没有,是否有一个来源,为全面列出的这些定义的各种编译器,如标题所有样本 #ifdef
s?
其他提示
没有编译器间标准,但每个编译器都趋于一致。您可以为自己构建一个标题,如下所示:
#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif
#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif
没有太多指向全面的列表,因为有数千个编译器,但只有3-4个被广泛使用(Microsoft C ++,GCC,Intel CC,可能是TenDRA?)。只需确定您的应用程序将支持哪些编译器,列出他们的#defines,并根据需要更新您的标头。
如果要在特定平台上转储所有可用功能,可以运行GCC,如:
gcc -march=native -dM -E - </dev/null
它会转储像 #define __SSE3__ 1
, #define __AES__ 1
等宏。
如果你想要一个交叉编译器解决方案然后就使用 Boost.Predef
其中包含
BOOST_ARCH_
系统/CPU建筑之一是编纂。BOOST_COMP_
编译器之一是使用。BOOST_LANG_
对于语言的标准之一是编纂反对。BOOST_LIB_C_
和BOOST_LIB_STD_C和C++标准图书馆在使用。BOOST_OS_
为操作系统,我们正在编制。BOOST_PLAT_
平台上操作系统编译器。BOOST_ENDIAN_
为字节序的操作系统和结构的组合。BOOST_HW_
对硬件的具体特征。BOOST_HW_SIMD
对于单指令(单指令多数据)检测。
例如
#if defined(BOOST_ARCH_X86)
#if BOOST_ARCH_X86_64
std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
#elif BOOST_ARCH_X86_32
std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
#endif
#elif defined(BOOST_ARCH_ARM)
#if _M_ARM
std::cout << "ARM " << _M_ARM << " \n";
#elif _M_ARM64
std::cout << "ARM64 " << _M_ARM64 << " \n";
#endif
#endif
你可以找到更多关于如何使用它 在这里,
没有什么标准。布莱恩钩的记录一些在他的"便携式开放源码束",甚至试图使他们成为什么连贯的和可用的(情况因人而异,关于那)。看到豪华。h头上这个网站:
注意,上面的链接可能需要你进入的一些伪造的用户名/密码由于DOS攻击前一段时间。
如果您需要对CPU功能进行细粒度检测,最好的方法是发送一个CPUID程序,该程序输出到stdout或某些“cpu_config.h”。提供CPU支持的功能集。然后,将该程序与构建过程集成。
不隶属于 StackOverflow