运行时检测系统架构(x86 / x64)

时间:2009-10-28 12:29:29

标签: c++ architecture system cpu processor

在程序 运行时(在windows下和linux下)是否可以在c ++中检测系统/处理器架构?

4 个答案:

答案 0 :(得分:4)

在Windows上,您可以使用__cpuid。在Linux上,您可以open("/proc/cpuinfo")查看它。

以下是Windows上的示例,基于MSDN页面中的示例:

#include <intrin.h>

bool cpuSupports64()
{
    int CPUInfo[4];
    __cpuid(CPUInfo, 0);
    return (CPUInfo[3] & 0x20000000) || false;
}

答案 1 :(得分:1)

在Linux下,您可以使用uname系统调用。它填充了这个用户分配的结构:

  struct utsname {
           char sysname[];    /* Operating system name (e.g., "Linux") */
           char nodename[];   /* Name within "some implementation-defined
                                 network" */
           char release[];    /* OS release (e.g., "2.6.28") */
           char version[];    /* OS version */
           char machine[];    /* Hardware identifier */
       #ifdef _GNU_SOURCE
           char domainname[]; /* NIS or YP domain name */
       #endif
       };

machine字段将标识体系结构。

答案 2 :(得分:0)

根据您打算如何处理此信息(例如,为特定CPU选择最快的手工编码汇编代码),在Linux下您可能需要读取/ proc / cpuinfo,特别是:“flags”部分,这样您就可以选择SSE / SSE2实施与MMX实施之间的比较。

大端系统与小端系统相比有点复杂,请参阅:http://en.wikipedia.org/wiki/Endianess

答案 3 :(得分:0)

您还可以使用处理器宏来检测 C++ 代码中的系统架构,例如:

#include <iostream>

int main()
{
#ifdef __x86_64__
    std::cout << "x86" << std::endl;
#endif

#ifdef __arm__
    std::cout << "arm" << std::endl;
#endif
}

这是Pre-defined Compiler Macros的参考列表。

EDIT:处理器宏与编译器无关,不同的编译器有不同的处理器宏,因此无法通过这种方式检测系统架构。