|
|
VC++获取 CPU 核心数的方法
- // 获取 CPU 核心数的方法
- #include <Windows.h>
- // 方法1:使用 GetSystemInfo (获取逻辑处理器数量)
- int GetCPUCoreCount_SystemInfo()
- {
- SYSTEM_INFO sysInfo;
- GetSystemInfo(&sysInfo);
- return sysInfo.dwNumberOfProcessors;
- }
- // 方法2:使用 GetNativeSystemInfo (64位系统推荐)
- int GetCPUCoreCount_Native()
- {
- SYSTEM_INFO sysInfo;
- GetNativeSystemInfo(&sysInfo);
- return sysInfo.dwNumberOfProcessors;
- }
- // 方法3:使用环境变量
- int GetCPUCoreCount_Env()
- {
- char* pValue = nullptr;
- size_t len = 0;
- errno_t err = _dupenv_s(&pValue, &len, "NUMBER_OF_PROCESSORS");
- int count = 0;
- if (err == 0 && pValue != nullptr)
- {
- count = atoi(pValue);
- free(pValue);
- }
- return count > 0 ? count : 1;
- }
复制代码 推荐使用方法1或方法2,简单可靠:
- // 在代码中使用
- SYSTEM_INFO sysInfo;
- GetSystemInfo(&sysInfo);
- int nCPUCores = sysInfo.dwNumberOfProcessors;
- // 例如设置 IO 工作线程数
- m_iMaxIOWorkers = nCPUCores;
复制代码
我来为你提供获取CPU核心数和判断64位系统的最优方法:
```cpp
// 获取系统信息结构体
struct SystemHardwareInfo {
int nCpuCoreCount; // CPU核心数(逻辑处理器数量)
BOOL bIs64BitOS; // 是否为64位操作系统
BOOL bIs64BitProcess; // 当前进程是否为64位
};
// 获取CPU核心数和系统位数信息
SystemHardwareInfo GetSystemHardwareInfo()
{
SystemHardwareInfo info = { 0 };
// 方法1:使用 GetNativeSystemInfo(推荐,可正确获取64位系统信息)
SYSTEM_INFO si = { 0 };
// GetNativeSystemInfo 在32位程序运行于64位系统时,返回真实的64位系统信息
// GetSystemInfo 在WOW64下会返回模拟的32位信息
typedef void (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO);
LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)
GetProcAddress(GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");
if (fnGetNativeSystemInfo != nullptr)
{
fnGetNativeSystemInfo(&si);
}
else
{
GetSystemInfo(&si);
}
// 获取CPU逻辑处理器数量(核心数 × 超线程数)
info.nCpuCoreCount = si.dwNumberOfProcessors;
// 判断是否为64位系统
// 方法:检查处理器架构
info.bIs64BitOS = (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64);
// 判断当前进程是否为64位
#ifdef _WIN64
info.bIs64BitProcess = TRUE;
#else
info.bIs64BitProcess = FALSE;
// 如果是32位进程,再次确认系统是否为64位(通过IsWow64Process)
if (!info.bIs64BitOS)
{
typedef BOOL (WINAPI *LPFN_IsWow64Process)(HANDLE, PBOOL);
LPFN_IsWow64Process fnIsWow64Process = (LPFN_IsWow64Process)
GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process");
if (fnIsWow64Process != nullptr)
{
BOOL bIsWow64 = FALSE;
if (fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
{
info.bIs64BitOS = bIsWow64; // 如果在WOW64下运行,说明是64位系统
}
}
}
#endif
return info;
}
// 简化版:仅获取CPU核心数
int GetCpuCoreCount()
{
SYSTEM_INFO si = { 0 };
GetSystemInfo(&si);
return si.dwNumberOfProcessors;
}
// 简化版:判断是否为64位系统
BOOL Is64BitOperatingSystem()
{
#ifdef _WIN64
return TRUE; // 64位程序只能运行在64位系统上
#else
BOOL bIsWow64 = FALSE;
typedef BOOL (WINAPI *LPFN_IsWow64Process)(HANDLE, PBOOL);
LPFN_IsWow64Process fnIsWow64Process = (LPFN_IsWow64Process)
GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process");
if (fnIsWow64Process != nullptr)
{
fnIsWow64Process(GetCurrentProcess(), &bIsWow64);
}
return bIsWow64;
#endif
}
```
### 使用示例
```cpp
// 完整信息
SystemHardwareInfo hwInfo = GetSystemHardwareInfo();
CString strInfo;
strInfo.Format(_T("CPU核心数: %d\n64位系统: %s\n64位进程: %s"),
hwInfo.nCpuCoreCount,
hwInfo.bIs64BitOS ? _T("是") : _T("否"),
hwInfo.bIs64BitProcess ? _T("是") : _T("否"));
// 简化调用
int nCores = GetCpuCoreCount();
BOOL b64Bit = Is64BitOperatingSystem();
```
### 说明
| 方法 | 用途 | 特点 |
|------|------|------|
| `GetNativeSystemInfo` | 获取真实系统信息 | 32位程序在64位系统下也能获取正确信息 |
| `GetSystemInfo` | 获取系统信息 | 在WOW64下返回模拟的32位信息 |
| `IsWow64Process` | 判断是否运行在WOW64下 | 用于32位程序检测64位系统 |
| `dwNumberOfProcessors` | 逻辑处理器数 | 包含超线程,如4核8线程返回8 |
|
|