在程序 运行时(在windows下和linux下)是否可以在c ++中检测系统/处理器架构?
答案 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:处理器宏与编译器无关,不同的编译器有不同的处理器宏,因此无法通过这种方式检测系统架构。