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.pswp.cn/bicheng/80611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80611.shtml
英文地址,請注明出處:http://en.pswp.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…