什么是最可靠的方法,以找出CPU结构时,汇编C或C++编码吗?我可以告诉,不同的编纂者有他们自己设定的非标准的预处理器定义(_M_X86 在MSVS, __i386__, __arm__ 在海湾合作委员会等)。

是有一个 标准 方式检测结构,我是建筑用的?如果没有,是否有一个来源,为全面列出的这些定义的各种编译器,如标题所有样本 #ifdefs?

有帮助吗?

解决方案

以下是有关预定义架构宏和其他类型的预览的一些信息定义的宏。

这个问题询问它们的定义位置在GCC源代码中。

其他提示

没有编译器间标准,但每个编译器都趋于一致。您可以为自己构建一个标题,如下所示:

#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支持的功能集。然后,将该程序与构建过程集成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top