VC++ 获取CPU信息的两种方法

文章目录

  • 方法一:使用 Windows API `GetSystemInfo` 和 `GetNativeSystemInfo` (基本信息)
    • 编译和运行
    • 代码解释
  • 方法二:使用 `__cpuid`(CPU序列号、特性等)
    • 代码解释:

开发过程中需要使用 VC++获取电脑CPU信息,先总结两种方法如下:

方法一:使用 Windows API GetSystemInfoGetNativeSystemInfo (基本信息)

这是获取 CPU 基本信息(如核心数、架构)的最简单方法。代码如下:

#include <windows.h>
#include <iostream>
#include <string>int main() {SYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo); // For applications running under WOW64 (32-bit on 64-bit OS),// this returns information about the emulated 32-bit environment.std::cout << "Using GetSystemInfo():" << std::endl;std::cout << "  Number of processors (cores/threads reported by OS): " << sysInfo.dwNumberOfProcessors << std::endl;std::cout << "  Processor type (deprecated, use wProcessorArchitecture): " << sysInfo.dwProcessorType << std::endl; // Deprecatedstd::cout << "  Processor architecture: ";switch (sysInfo.wProcessorArchitecture) {case PROCESSOR_ARCHITECTURE_AMD64:   std::cout << "x64 (AMD or Intel)" << std::endl; break;case PROCESSOR_ARCHITECTURE_ARM:     std::cout << "ARM" << std::endl; break;case PROCESSOR_ARCHITECTURE_ARM64:   std::cout << "ARM64" << std::endl; break;case PROCESSOR_ARCHITECTURE_IA64:    std::cout << "Intel Itanium-based" << std::endl; break; // Rarecase PROCESSOR_ARCHITECTURE_INTEL:   std::cout << "x86" << std::endl; break;default:                             std::cout << "Unknown architecture (" << sysInfo.wProcessorArchitecture << ")" << std::endl; break;}std::cout << "  Processor level: " << sysInfo.wProcessorLevel << std::endl;std::cout << "  Processor revision: " << sysInfo.wProcessorRevision << std::endl;std::cout << "  Page size: " << sysInfo.dwPageSize << " bytes" << std::endl;std::cout << "  Minimum application address: " << sysInfo.lpMinimumApplicationAddress << std::endl;std::cout << "  Maximum application address: " << sysInfo.lpMaximumApplicationAddress << std::endl;std::cout << "  Active processor mask: 0x" << std::hex << sysInfo.dwActiveProcessorMask << std::dec << std::endl;std::cout << std::endl;// For 32-bit applications running on 64-bit Windows (WOW64),// GetNativeSystemInfo provides information about the host system's processor.// For 64-bit applications, it's the same as GetSystemInfo.// It's generally better to use GetNativeSystemInfo if you want the true hardware info.SYSTEM_INFO nativeSysInfo;GetNativeSystemInfo(&nativeSysInfo);std::cout << "Using GetNativeSystemInfo():" << std::endl;std::cout << "  Number of processors (cores/threads reported by OS): " << nativeSysInfo.dwNumberOfProcessors << std::endl;std::cout << "  Processor architecture: ";switch (nativeSysInfo.wProcessorArchitecture) {case PROCESSOR_ARCHITECTURE_AMD64:   std::cout << "x64 (AMD or Intel)" << std::endl; break;case PROCESSOR_ARCHITECTURE_ARM:     std::cout << "ARM" << std::endl; break;case PROCESSOR_ARCHITECTURE_ARM64:   std::cout << "ARM64" << std::endl; break;case PROCESSOR_ARCHITECTURE_IA64:    std::cout << "Intel Itanium-based" << std::endl; break;case PROCESSOR_ARCHITECTURE_INTEL:   std::cout << "x86" << std::endl; break;default:                             std::cout << "Unknown architecture (" << nativeSysInfo.wProcessorArchitecture << ")" << std::endl; break;}std::cout << "  Processor level: " << nativeSysInfo.wProcessorLevel << std::endl;std::cout << "  Processor revision: " << nativeSysInfo.wProcessorRevision << std::endl;// To get logical processor information (NUMA nodes, core relationships, cache)// you would use GetLogicalProcessorInformation or GetLogicalProcessorInformationEx// which are more complex.return 0;
}

编译和运行

  1. 创建一个新的 C++ 空项目或 Win32 控制台应用程序项目。
  2. 将以上代码粘贴到主 .cpp 文件中。
  3. 编译并运行。

代码解释

  • GetSystemInfo: 获取当前进程运行环境的系统信息。如果一个 32 位程序运行在 64 位 Windows (WOW64) 上,它会返回模拟的 32 位环境信息。
  • GetNativeSystemInfo: 获取物理硬件的系统信息。在 64 位系统上,即使是 32 位程序调用它,也会得到 64 位系统的信息。通常推荐使用这个函数来获取真实的硬件信息。
  • dwNumberOfProcessors: 返回操作系统报告的逻辑处理器数量(可能是物理核心数,也可能是启用了超线程后的线程数)。
  • wProcessorArchitecture: 返回 CPU 的架构(x86, x64, ARM 等)。
  • wProcessorLevelwProcessorRevision: 提供关于处理器型号和修订版本的一些信息,但具体含义依赖于处理器架构。

运行效果如下图:
方法一运行效果

方法二:使用 __cpuid(CPU序列号、特性等)

引入intrin.h头文件,获取CPU序列号、特性等信息。代码如下:

#include <stdio.h>  
#include <windows.h>  #ifdef _MSC_VER  
#include <intrin.h> // 如果使用的是 MSVC 编译器,则包含此头文件以支持 __cpuid 指令  
#else  
#include <cpuid.h>  // 如果使用的是其他编译器,则包含此头文件以支持 __cpuid 指令  
#endif  int main()  
{  // 定义四个无符号整数变量,用于存储 CPUID 指令的返回值unsigned int eax = 0, ebx = 0, ecx = 0, edx = 0;  #ifdef _MSC_VER  // 如果使用的是 MSVC 编译器int cpuInfo[4];  // 定义一个数组用于存储 CPUID 指令的结果__cpuid(cpuInfo, 1);  // 调用 __cpuid 指令,功能号为 1,获取处理器信息eax = cpuInfo[0];  // 将返回值的 eax 寄存器内容存储到变量 eaxebx = cpuInfo[1];  // 将返回值的 ebx 寄存器内容存储到变量 ebxecx = cpuInfo[2];  // 将返回值的 ecx 寄存器内容存储到变量 ecxedx = cpuInfo[3];  // 将返回值的 edx 寄存器内容存储到变量 edx
#else  // 如果使用的是非 MSVC 编译器__cpuid(1, eax, ebx, ecx, edx);  // 直接调用 __cpuid 指令,功能号为 1,获取处理器信息
#endif  // 打印处理器 ID(ProcessorId),格式与命令 "wmic cpu get processorid" 的输出一致printf("ProcessorId:  %08X%08X\n", edx, eax);  // 打印 CPU 特性信息,分别显示 eax、ebx、ecx 和 edx 的值printf("CPU Features: %08X-%08X-%08X-%08X\n", eax, ebx, ecx, edx);  return 0;  // 返回 0,表示程序正常结束
}

代码解释:

  1. 头文件包含:
    #include <stdio.h>:用于标准输入输出(如 printf)。
    #include <windows.h>:提供 Windows 平台相关功能。
    • 根据编译器选择包含 intrin.hcpuid.h,以支持 __cpuid 指令。
  2. CPUID 指令:
    • CPUID 是一个 x86 指令,用于获取处理器的详细信息。
    • 功能号 1 用于获取处理器的特定信息,包括处理器 ID 和特性标志。
  3. 跨编译器支持:
    • 使用条件编译(#ifdef _MSC_VER)区分 MSVC 和其他编译器的实现方式。
  4. 输出:
    • ProcessorId 是由 edx 和 eax 组合而成的值,表示处理器的唯一标识。
    • CPU Features 显示了处理器支持的特性标志,分别存储在 eax、ebx、ecx 和 edx 中。

运行效果如下图:
方法二运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Compose 的历史和发展

这张图表展示了Docker Compose从V1到V2的演变过程&#xff0c;并解释了不同版本的Compose文件格式及其支持情况。以下是对图表的详细讲解&#xff1a; Compose V1 No longer supported: Compose V1已经不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …

24、TypeScript:预言家之书——React 19 类型系统

一、预言家的本质 "TypeScript是魔法世界的预言家之书&#xff0c;用静态类型编织代码的命运轨迹&#xff01;" 霍格沃茨符文研究院的巫师挥动魔杖&#xff0c;类型注解与泛型的星轨在空中交织成防护矩阵。 ——基于《国际魔法联合会》第12号类型协议&#xff0c;Ty…

(2025,AR,NAR,GAN,Diffusion,模型对比,数据集,评估指标,性能对比)文本到图像生成和编辑:综述

【本文为我在去年完成的综述&#xff0c;因某些原因未能及时投稿&#xff0c;但本文仍能为想要全面了解文本到图像的生成和编辑的学习者提供可靠的参考。目前本文已投稿 ACM Computing Surveys。 完整内容可在如下链接获取&#xff0c;或在 Q 群群文件获取。 中文版为论文初稿&…

MATLAB的cvpartition函数用法

1. 函数作用 cvpartition 将数据集划分为训练集和测试集&#xff0c;支持多种交叉验证方法&#xff0c;包括&#xff1a; Hold-Out验证&#xff1a;单次划分&#xff08;如70%训练&#xff0c;30%测试&#xff09;K折交叉验证&#xff1a;数据分为K个子集&#xff0c;依次用其…

Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析

目录 1.前言 2.正文 2.1状态码 2.2HTTP与HTTPS的关系 2.3SSL协议 2.3.1对称加密 2.3.2非对称加密 2.3.3中间人攻击 2.3.4校验机制 2.3.4.1证书 2.3.4.2数字签名 1. 数字签名的生成过程 2. 数字签名的验证过程 2.4TLS协议&#xff08;握手过程&#xff09; 3.小结…

代码随想录算法训练营第三十七天

LeetCode题目: 300. 最长递增子序列674. 最长连续递增序列718. 最长重复子数组2918. 数组的最小相等和(每日一题) 其他: 今日总结 往期打卡 300. 最长递增子序列 跳转: 300. 最长递增子序列 学习: 代码随想录公开讲解 问题: 给你一个整数数组 nums &#xff0c;找到其中最长…

【Java ee初阶】网络原理

TCP协议 1.确认应答 实现可靠传输的核心机制 2.超时重传 实现可靠传输的核心机制 3.连接管理 网络部分最高频的面试题 4.滑动窗口 提高传输效率的机制 5.流量控制 依据接收方的处理能力&#xff0c;限制发送方的发送速度。 6.拥塞控制 依据传输链路的处理能力&#xff0c…

B站取关脚本

个人的账号可能被盗了&#xff0c;发现关注数量蹦到3000多&#xff0c;然后b站没有一键取关的按钮&#xff0c;并且对api的访问有速度限制&#xff0c;然后网上的脚本很多都已经失效了&#xff0c;所以自己稍微写个简陋的 测试时间: 2025.05.11 使用步骤: 进入b站的关注页面…

PyGame游戏开发(含源码+演示视频+开结题报告+设计文档)

前言&#xff1a; 大二小学期python课上基于pygame做的一个游戏小demo&#xff0c;当时老师花了一天讲解了下python基础语法后&#xff08;也是整个大学四年唯一学习python的时间&#xff09;&#xff0c;便让我们自学网课一周然后交项目&#xff0c;所以做的非常仓促&#xff…

使用 React 实现语音识别并转换功能

在现代 Web 开发中&#xff0c;语音识别技术的应用越来越广泛。它为用户提供了更加便捷、自然的交互方式&#xff0c;例如语音输入、语音指令等。本文将介绍如何使用 React 实现一个简单的语音识别并转换的功能。 功能概述 我们要实现的功能是一个语音识别测试页面&#xff0…

C++ 双峰高斯函数拟合

C 双峰高斯函数拟合 一维高斯函数二维高斯函数多维高斯函数一维双峰高斯函数代码实现 二维双峰高斯函数代码实现 多维多峰高斯函数 在数据分析与清洗中经常遇到这样的数据&#xff1a;数据不仅仅向单个中心靠拢&#xff0c;而是类似分段的向两个甚至多个中心靠拢。数据向单个中…

【RP2350】香瓜树莓派RP2350之LED

本文最后修改时间&#xff1a;2025年05月10日 01:57 一、本节简介 本节以树莓派pico2开发板为例&#xff0c;举例如何写一个LED驱动加进工程里。 二、实验平台 1、硬件平台 1&#xff09;树莓派pico2开发板 ①树莓派pico2开发板&#xff08;作为仿真器&#xff09; ②micr…

机器人运动控制原理浅析-UC Berkeley超视觉模态模型

加州伯克利发布的超视觉多感知模态融合(FuSe, Fuse Heterogeneous Sensory Data)模型&#xff0c;基于视觉、触觉、听觉、本体及语言等模态&#xff0c;利用自然语言跨模态对齐(Cross-Modal Grounding)优调视觉语言动作等通用模型&#xff0c;提高模型任务成功率。 总体框架 …

【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)

Bootstrap V4系列 学习入门教程之 组件-媒体对象&#xff08;Media object&#xff09; 媒体对象&#xff08;Media object&#xff09;一、Example二、Nesting 嵌套三、Alignment 对齐四、Order 顺序五、Media list 媒体列表 媒体对象&#xff08;Media object&#xff09; B…

解决VirtualBox中虚拟机(ubuntu)与主机(windows)之间互相复制粘贴(文本)

一.开始的设置 1.在VirtualBox中打开设置&#xff0c;常规中修改主机与虚拟机交互设置 2.虚拟机关闭状态下&#xff0c;存储中选中控制器SATA&#xff0c;勾选‘使用主机输入输出’ 3.选中操作系统对应的虚拟文件&#xff0c;.vdi文件&#xff0c;勾选右边的固态驱动器。 4.启…

java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多线程和高性能编程领域提供了丰富的现成框架和工具&#xff0c;既有标准库中的并发组件&#xff0c;也有第三方框架。以下是一些关键框架及其应用场景的总结&#xff1a;便于后面我们站在巨人的肩膀上&#xff0c;继续前行 一、Java 标准库中的多线程框架 Execut…

Nodejs核心机制

文章目录 前言 前言 结合 Node.js 的核心机制进行说明&#xff1a; 解释事件循环的各个阶段。 答案 Node.js 事件循环分为 6 个阶段&#xff0c;按顺序执行&#xff1a; Timers&#xff1a;执行 setTimeout 和 setInterval 的回调。 Pending I/O Callbacks&#xff1a;处理系…

C++笔记6:数字字面量后缀和前缀总结

在C中&#xff0c;可以在数字字面量后面添加字母后缀&#xff08;或前缀&#xff09;来表示特定的数据类型。这些后缀能够明确指定字面量的类型&#xff0c;避免类型转换带来的潜在问题。以下是常见的几种类型后缀及其含义&#xff1a; 1. 整数后缀 u 或 U&#xff1a;表示 u…

50.辐射抗扰RS和传导抗扰CS测试环境和干扰特征分析

辐射抗扰RS和传到抗扰CS测试环境和干扰特征分析 1. 辐射抗扰RS2. 传导抗扰CS 1. 辐射抗扰RS 辐射抗扰RS考察对外界电磁场干扰得抗扰能力&#xff0c;测试频段为80MHz~2000MHz&#xff0c;用1KHz得正弦波进行调幅&#xff0c;在电波暗室内进行。测试标准&#xff1a;IEC 61000-…

Java多态详解

Java多态详解 什么是多态&#xff1f; 比如我们说&#xff1a;“驾驶一辆车”&#xff0c;有人开的是自行车&#xff0c;有人开的是摩托车&#xff0c;有人开的是汽车。虽然我们都说“开车”&#xff0c;但“怎么开”是由具体的车类型决定的&#xff1a;“开”是统一的动作&a…