成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據結構是如何裝入CPU寄存器的?

商務辦公
我們在之前很多文章的講解中涉及了CPU與寄存器,然后有同學問了這樣一個問題:既然CPU內部的寄存器數量有限,容量有限,那么我們使用的龐大的數據結構是怎樣裝入寄存器供CPU計算的呢?

[[417318]]

大家好,我是小風哥。

我們在之前很多文章的講解中涉及了CPU與寄存器,然后有同學問了這樣一個問題:既然CPU內部的寄存器數量有限,容量有限,那么我們使用的龐大的數據結構是怎樣裝入寄存器供CPU計算的呢?

這篇文章就為你講解一下這個問題。

內存與數據

真正有用的程序是離不開數據的,比如一個int、一個float等,這些都是非常簡單的數據。

當然也有非常復雜的數據,這樣的數據通常在內存中以數據結構的形式組織起來,比如你創建了一個數組、一個鏈表、創建了一棵樹、一張圖,就像這樣:

那么很顯然這些數據存放在內存中,而且這些數據在不同的場景下有不同的大小,從數B、數KB到數百GB都有可能,與此同時,CPU內部的寄存器數量是固定的,容量也是極其有限的,那么CPU是如何利用有限的資源操作龐大的數據結構呢?

要回答這一問題,我們需要要認識一位農夫,因為他不生產數據,他只是數據的搬運工,這位農夫就是。。

搬運數據的機器指令

你沒有看錯,這位農夫就是我們之前多次提到的機器指令。

機器指令中除了負責邏輯運算、執行流控制、函數調用等指令外,還有一類指令,這類執行只負責和內存打交道,典型的就是精簡指令集架構中的Load/Store機器指令,即內存讀寫指令(復雜指令集沒有單獨的內存讀寫指令)。

原來,從宏觀上看的話,存放在內存中的數據,比如一個數組,可能會非常龐大,但是具體到代碼,每一個步驟操作的數據又會非常簡單,就像這樣:

  1. int* huge_arr = new int[1 * 1024* 1024 *1024]; 

我們創建了一個長度為1G的數組,每個int 4字節,則這個數組的大小就是4GB,這顯然是一個很龐大的數組。

對于這樣的數據,我們通常都會怎么使用呢?

最常見的情況可能是遍歷一邊,然后對每個字符進行一個簡單操作,這里以計算數組之和為例:

  1. long int sum = 0; 
  2. for (int i = 0; i < 1 * 1024* 1024 *1024; i++) { 
  3.     sum += huge_arr[i]; 

雖然整個數組多達4GB,但具體到每一步我們一次只能操作一個元素,就像這里的:

  1. sum += huge_arr[i]; 

這行代碼翻譯成機器指令可能是這樣的,我們假設此時i為100:

  1. load $r0 100($r2) 
  2. add $r1 $r1 $r0 

(注意,實際當中編譯器不會傻傻的生成100這樣的常數,這里代碼僅用來方便講解問題)。

第一行指令中數組首地址存放在寄存器r2中,100($r2)表示數組首地址+100,這樣我們就能得到huge_arr[100]的地址了,然后將該地址中的值利用load指令加載到寄存器r0中。

第二行就簡單多了,r1寄存器中保存的是sum的值,該行指令執行過后r1中的值就已經加上了huge_arr[100]。

現在你應該能看出來了吧,雖然我們不能把整個數組加載到寄存器供CPU計算,但這其實是沒有必要的,因為我們一次只能操作數組中的一個元素,我們只需要把這一個元素加載到寄存器就足矣了。

 

對于其它復雜的數據結構也是同樣的道理,無論多么復雜的數據,代碼對其一次的操作都是很簡單很微小的,這一微小的操作使用的基本元素都可以通過內存讀寫指令加載到寄存器,修改完后再寫回內存。

編譯器

現在你應該知道了為什么CPU內部那么少的寄存器能操作內存中龐大的數據結構,實際上由于內存中的數據要遠大于CPU寄存器的容量,因此編譯器必須精心挑選,好讓那些經常使用的數據放到寄存器中的時間更長一點,這樣可以減少內存讀寫次數。

在上面的示例中,r2寄存器保存的是huge_arr這個數組在內存中的起始地址,那么這個數據應該放到寄存器中,因為后續遍歷到的每一個元素都要用到該地址,這項工作就是編譯器來完成的。

編譯器把那些經常使用的數據放到寄存器,剩下的放到內存中,然后利用內存讀寫指令在寄存器和內存之間來回搬運數據。

總結

通過本文不難發現,實際上我們沒有必要一次性把整個數據全部裝到CPU寄存器中,而是用到哪些才裝載哪些。

在最細粒度的操作中,依賴的操作數都可以直接加載到內存,這通常是由內存讀寫機器指令來完成的。 

我是小風哥,希望這篇文章對大家理解CPU與寄存器有所幫助。

本文轉載自微信公眾號「碼農的荒島求生」,可以通過以下二維碼關注。轉載本文請聯系碼農的荒島求生公眾號。

 

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2009-12-17 17:31:38

2020-10-15 14:50:24

寄存器CPU部件

2025-06-10 02:22:00

C語言硬件寄存器

2023-09-14 12:35:28

寄存器

2018-10-22 12:18:50

存儲器內存寄存器

2009-04-20 14:55:20

思科配置寄存器

2021-03-15 10:00:38

鴻蒙HarmonyOS應用

2022-11-30 07:47:36

硬件速度差異讀寫

2021-02-26 08:46:46

PHY寄存器網絡

2012-11-05 10:27:41

程序員數據結構

2025-05-12 00:00:15

2020-10-21 06:39:21

CPU寄存器架構

2024-11-14 08:00:00

Python迭代器

2017-07-05 14:37:07

Linux調試器寄存器和內存

2021-05-10 08:20:32

CPU 符號整數

2023-10-31 08:51:25

數據結構存儲數據

2011-03-31 15:41:51

Cacti數據表結構

2023-07-03 17:24:33

數據結構

2014-12-10 10:35:43

微信 數據結構

2012-04-28 14:21:47

Java數據結構線性結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜激情在线 | 精品一区在线免费观看 | 中文字幕免费中文 | 一级黄色片在线看 | 欧美xxxx网站 | 日韩黄色免费 | 欧美精品在线一区 | 中文二区| 国产精品久久久久av | a级免费黄色片 | 日韩精品免费视频 | 精品国产黄色片 | 日韩一区二区三区在线看 | 密室大逃脱第六季大神版在线观看 | 精品欧美一区二区精品久久久 | 成人免费在线小视频 | 亚洲精品电影在线观看 | www国产成人免费观看视频,深夜成人网 | 视频在线一区二区 | 国产一区二区三区视频 | 精品国产乱码一区二区三区 | 久久尤物免费一区二区三区 | 日日操天天射 | 国产精品久久久久久久久 | 久久久久久久久久久久久久av | 亚洲精品久久久久久久久久久久久 | 久久精品网 | av电影手机版 | 精品91久久久 | 成人在线小视频 | julia中文字幕久久一区二区 | 久久精品这里精品 | 亚洲精品日韩精品 | 成人小视频在线观看 | www.久久久| 午夜天堂精品久久久久 | 久久精品国产一区 | 在线播放国产一区二区三区 | 成人无遮挡毛片免费看 | 国产精品国产成人国产三级 | 久久免费精品 |