C語言開發之閃電飛刀 register

2021-06-07 17:58:51 字數 1115 閱讀 2705

register就和它的名字一樣,很少出現在**世界中,因為敢稱為閃電飛刀的變數,通常只會在一些特定場合才能出現。它是如此的快,以致於cpu都對其刮目相看,但是它有乙個致命的缺點,它的速度「看心情」而定,不是每一次都能讓人滿意。

1)         作用

如果乙個變數被register來修辭,就意味著,該變數會作為乙個暫存器變數,讓該變數的訪問速度達到最快。比如:乙個程式邏輯中有乙個很大的迴圈,迴圈中有幾個變數要頻繁進行操作,這些變數可以宣告為register型別。

2)         暫存器變數

暫存器變數是指乙個變數直接引用暫存器,也就是對變數名的操作的結果是直接對暫存器進行訪問。暫存器是cpu的親信,cpu操作的每個運算元和操作結果,都由暫存器來暫時儲存,最後才寫入到記憶體或從記憶體中讀出。也就是說,變數的值通常儲存在記憶體中,cpu對變數進行讀取先是將變數的值從記憶體中讀取到暫存器中,然後進行運算,運算完將結果寫回到記憶體中。為什麼要這麼設計,而不直接對變數的值從記憶體中進行運算,而要再借助於暫存器?這是由於考慮到效能的問題才這麼設計的。在計算機系統中,包含有很多種不同型別的儲存器,如圖2.9所示

圖2.9

在計算機中cpu的運算速度最快,現在都達到3ghz左右,而相對應的儲存器速度卻相對慢很多,訪問速度最快的暫存器和快取,由於其體積又大,不適合大容量的使用,所以只能二者相接合的方式來提高效率。程式**儲存在記憶體中,當使用資料時,將其送到暫存器,讓cpu來訪問,使用完畢,送回記憶體儲存。而c語言又允許使用暫存器來儲存變數的值,很明顯這樣能大大提高程式的執行速度,但是,暫存器的個數是有限的,x86也就是十幾個,arm最多才37個。我們不可能將全部的變數都宣告為暫存器變數,因為其它**也要使用暫存器,同樣,我們宣告的暫存器變數也不一定直接儲存在暫存器中,因為暫存器可能全部都在被其它**占用。編譯器只能是盡量的為我們的變數安排在暫存器中。

在使用暫存器變數時,請注意:

待宣告為暫存器變數型別應該是cpu暫存器所能接受的型別,意味著暫存器變數是單個變數,變數長度應該小於等於暫存器長度

不能對暫存器變數使用取位址符「&」,因為該變數沒有記憶體位址

盡量在大量頻繁的操作時使用暫存器變數,且宣告的變數個數應該盡量的少

C語言開發之專一王子 volatile

每個變數和他的名字一樣很善變,有時候它善變是發自內心的,有時是外部因素決定的,只有volatile變數才會表裡如一,因此獲得了專一王子的美譽 作用 volatile字面意思是易揮發,易變化的意思,它修辭的變數表示該變數的值很容易由於外部因素發生改變,強烈請求編譯器要老老實實的在每次對變數進行訪問時去...

iOS開發之 C語言之預處理

大家都知道乙個c程式的執行包括編譯和鏈結兩個階段,其實在編譯之前預處理器首先要進行預處理操作,將處理完產生的乙個新的原始檔進行編譯。由於預處理指令是在編譯之前就進行了,因此很多時候它要比在程式執行時進行操作效率高。在c語言中包括三類預處理指令,今天將一一介紹 巨集定義條件編譯 檔案包含 對於程式中經...

飛刀推球搜眾神推球 c語言程式的編譯過程

根據知名球料公中號 眾神推球 表明 經典的hello world,通常是你的第乙個c語言程式 include int main printf hello world n return 0 對於這個最簡單的 hello world!程式 hello.c,它的生命週期一開始時是乙個高階c程式,因為它處於...