检测CPU架构编译时(Detecting CPU architecture compile-time

2019-07-20 22:23发布

什么是编译C或C ++代码时,发现CPU架构的最可靠的方法是什么? 据我所知,不同的编译器有自己的一套非标准的预处理器定义( _M_X86在MSVS, __i386____arm__在GCC等)。

有没有检测到我建立了架构的标准呢? 如果没有,是否有这样的定义,对各种编译器的完整列表源,如所有的样板头#ifdef S'

Answer 1:

下面是对一些信息的预先定义的架构宏和其他类型的预定义宏。

这个问题问它们被定义在GCC的源代码。



Answer 2:

有没有编译器间的标准,但每个编译器往往是相当一致的。 你可以建立一个标题为自己这件事情是这样的:

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

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

没有太多点的完整列表,因为有成千上万的编译器,但只有3-4中广泛使用(微软C ++,GCC,英特尔CC,也许TenDRA?)。 只要决定哪些编译器您的应用程序将支持,列出他们的#define语句,并根据需要更新你的头。



Answer 3:

如果您想倾倒在特定平台上所有可用的功能,你可以运行GCC这样的:

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

这将转储像宏#define __SSE3__ 1#define __AES__ 1 ,等等。



Answer 4:

没有什么标准。 布赖恩·胡克记录这些一堆在他的“便携式开源线束”,甚至试图把他们弄成连贯和可用(因人而异关于这一点)。 请参阅本网站上的posh.h头:

  • http://hookatooka.com/poshlib/

请注意,上面的链接可能需要您前一段时间进入一些假的用户名/密码,由于DOS攻击。



Answer 5:

如果你想有一个交叉编译器解决方案则只需使用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的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

你可以找到更多关于如何使用它在这里



Answer 6:

如果你需要一个精细的检测CPU的功能,最好的办法也是出货,输出到标准输出或一些“cpu_config.h”文件的一组由CPU所支持的功能CPUID程序。 然后,您可以集成构建过程中该程序。



文章来源: Detecting CPU architecture compile-time