2

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

4

4 回答 4

4

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

这是基于MSDN页面中的示例的 Windows 示例:

#include <intrin.h>

bool cpuSupports64()
{
    int CPUInfo[4];
    __cpuid(CPUInfo, 0);
    return (CPUInfo[3] & 0x20000000) || false;
}
于 2009-10-28T12:33:19.440 回答
3

在 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字段将识别架构。

于 2009-10-28T13:59:00.540 回答
0

根据您打算如何处理此信息(例如,为特定 CPU 选择最快的手工编码汇编代码),在 Linux 下您可能需要阅读 /proc/cpuinfo,特别是:“标志”部分,因此您可以在 SSE 之间进行选择/SSE2 实现与 MMX 实现与其他。

Big endian system vs little endian system稍微复杂一些,参考:http ://en.wikipedia.org/wiki/Endianess

于 2009-10-28T12:48:28.607 回答
0

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

#include <iostream>

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

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

这是预定义编译器宏的参考列表。

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

于 2021-03-12T02:39:32.297 回答