这是一个在 Windows 平台下非常常用的 API 函数,用于获取当前系统的各种信息,CPU 数量、页面大小、硬件架构等。

函数概述
GetSystemInfo 函数用于填充一个 SYSTEM_INFO 结构体,该结构体包含了当前计算机系统的相关信息,这对于需要编写跨平台兼容性代码、进行性能优化或进行底层系统编程的开发者来说非常有用。
函数原型 (在 Windows.h 中定义):
VOID GetSystemInfo( [out] LPSYSTEM_INFO lpSystemInfo );
参数说明:
lpSystemInfo: 指向一个SYSTEM_INFO结构体的指针,函数执行后,这个结构体的各个字段将被填充上系统的相关信息。LPSYSTEM_INFO是SYSTEM_INFO*的别名,意思是“指向SYSTEM_INFO结构体的指针”。[out]表示这是一个输出参数,数据由函数写入。
返回值:

- 无返回值 (
VOID),所有信息都通过SYSTEM_INFO结构体返回。
关头文件
在使用 GetSystemInfo 之前,必须包含 Windows SDK 的头文件:
#include <windows.h>
SYSTEM_INFO 结构体
这是 GetSystemInfo 函数的核心,它的定义如下(具体字段可能因 Windows 版本略有不同):
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId; // 旧版Windows使用,现已废弃
struct {
WORD wProcessorArchitecture;
WORD wReserved;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
DWORD dwPageSize; // 系统页面大小(字节)
LPVOID lpMinimumApplicationAddress; // 用户模式最小可用地址
LPVOID lpMaximumApplicationAddress; // 用户模式最大可用地址
DWORD_PTR dwActiveProcessorMask; // 活动处理器的掩码
DWORD dwNumberOfProcessors; // 物理处理器的数量(逻辑核心数)
DWORD dwProcessorType; // 处理器类型(已废弃,请使用wProcessorArchitecture)
DWORD dwAllocationGranularity; // VirtualAlloc的分配粒度
WORD wProcessorLevel; // 处理器级别(如型号)
WORD wProcessorRevision; // 处理器修订版本
} SYSTEM_INFO, *LPSYSTEM_INFO;
常用字段解释:
dwPageSize: 系统内存分页的大小(4096 字节),在进行内存对齐操作时很有用。lpMinimumApplicationAddress/lpMaximumApplicationAddress: 定义了当前进程可以使用的用户模式虚拟内存的地址范围,所有动态内存分配(如malloc,VirtualAlloc)都会发生在这个范围内。dwNumberOfProcessors: 系统中逻辑处理器的数量,这是进行多线程并行计算时决定创建多少个线程的重要参考。wProcessorArchitecture: 一个WORD值,表示处理器的架构。PROCESSOR_ARCHITECTURE_INTEL(0): x86PROCESSOR_ARCHITECTURE_AMD64(9): x64PROCESSOR_ARCHITECTURE_ARM(5): ARMPROCESSOR_ARCHITECTURE_ARM64(12): ARM64PROCESSOR_ARCHITECTURE_UNKNOWN(0xFFFF): 未知
dwActiveProcessorMask: 一个位掩码,每一位代表一个逻辑处理器,如果第i位为 1,表示第i个处理器是活动的,这个值可以用来将线程绑定到特定的核心。
代码示例
下面是一个完整的 C 语言示例,演示如何使用 GetSystemInfo 并打印出其主要信息。
#include <stdio.h>
#include <windows.h> // 必须包含此头文件
int main() {
// 1. 声明一个 SYSTEM_INFO 结构体变量
SYSTEM_INFO si;
// 2. 调用 GetSystemInfo 函数填充结构体
GetSystemInfo(&si);
// 3. 打印结构体中的信息
printf("--- System Information ---\n");
// 打印处理器架构
printf("Processor Architecture: ");
switch (si.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_INTEL:
printf("x86\n");
break;
case PROCESSOR_ARCHITECTURE_AMD64:
printf("x64\n");
break;
case PROCESSOR_ARCHITECTURE_ARM:
printf("ARM\n");
break;
case PROCESSOR_ARCHITECTURE_ARM64:
printf("ARM64\n");
break;
case PROCESSOR_ARCHITECTURE_UNKNOWN:
default:
printf("Unknown\n");
break;
}
// 打印页面大小
printf("Page Size: %u bytes\n", si.dwPageSize);
// 打印处理器数量
printf("Number of Processors (Cores): %u\n", si.dwNumberOfProcessors);
// 打印内存分配粒度
printf("Allocation Granularity: %u bytes\n", si.dwAllocationGranularity);
// 打印内存地址范围
printf("Minimum Application Address: %p\n", si.lpMinimumApplicationAddress);
printf("Maximum Application Address: %p\n", si.lpMaximumApplicationAddress);
// 打印处理器级别和修订版本
printf("Processor Level: %u\n", si.wProcessorLevel);
printf("Processor Revision: %u\n", si.wProcessorRevision);
printf("--------------------------\n");
return 0;
}
如何编译和运行 (使用 MinGW-gcc):
- 将代码保存为
getsysinfo.c。 - 打开命令行或终端。
- 使用以下命令进行编译:
gcc -o getsysinfo.exe getsysinfo.c
- 运行生成的可执行文件:
.\getsysinfo.exe
示例输出 (在一台 x64 机器上):
--- System Information ---
Processor Architecture: x64
Page Size: 4096 bytes
Number of Processors (Cores): 8
Allocation Granularity: 65536 bytes
Minimum Application Address: 0000000000000000
Maximum Application Address: 00007FFFFFFFFFFF
Processor Level: 6
Processor Revision: 16404
--------------------------
重要注意事项
-
平台限制:
GetSystemInfo是 Windows 特有的 API,如果你需要编写跨平台的 C 代码(例如在 Linux 或 macOS 上也能运行),不能使用这个函数,在 Linux 上,你可以通过读取/proc/cpuinfo文件或使用sysconf函数来获取类似信息;在 macOS 上,可以使用sysctl函数。 -
获取更详细的 CPU 信息:
GetSystemInfo提供的是比较宏观的系统信息,如果你需要获取每个 CPU 核心的详细信息(如缓存大小、型号名称等),应该使用更高级的 API,如GetLogicalProcessorInformation。 -
线程亲和性 (Thread Affinity):
dwActiveProcessorMask字段可以用来实现线程亲和性,即强制某个线程只在特定的 CPU 核心上运行,这可以通过 Windows APISetThreadAffinityMask来实现,有时可以用于性能调优。 -
版本兼容性:
SYSTEM_INFO结构体的定义在不同版本的 Windows 中可能略有增删。wProcessorLevel和wProcessorRevision是在较新的版本中引入的,但核心字段(如dwPageSize,dwNumberOfProcessors)非常稳定。
