1. 程式人生 > >C語言關鍵字淺析-register

C語言關鍵字淺析-register

### C語言關鍵字淺析系列 ###

### ISO/ANSI C 關鍵字 ###

register字面意思即計算機科學裡講的暫存器

C語言中有5大儲存類:自動類、暫存器類、具有外部連結的靜態類、具有內部連結的靜態類、空連結的靜態類

其中,register是宣告暫存器類的暫存器變數的關鍵字

 

register的作用是:
宣告暫存器變數。

 

1、為什麼會有這種類

眾所周知,在經典計算機體系結構中,儲存裝置的讀寫速度是有階級之分的,且受容量、造價等因素影響

通常速度最快的是暫存器,其次是CPU和主存,有時候為了匹配CPU和主存間的速度差距還會在其中間加入高速Cache快取的裝置

對於C語言,雖然它是高階語言中非常底層的一門語言,但其變數也通常都儲存在計算機的記憶體,即主存中

但如果我們把一些經常使用的變數放到暫存器中儲存,可能會收穫更快的速度和更好的執行效率

這就催生了暫存器變數的產生:

register int q;   /* 在基本資料型別前帶上register的帽子表示申請一個暫存器變數 */

void fun(register int q)   /* 可以把一個形參請求為暫存器變數 */

2、暫存器變數的請求

注意說法上的區別,這裡的“請求”指的是register只是讓這條語句成為對編譯器的一個請求,而不是直接指令

編譯器會在遇到register後,在請求和可用暫存器(很多計算機體系結構中都有)數量或可用高速記憶體數量間權衡

所以一定概率上,這個變數不會被使用暫存器儲存,這時這個變數會被當做一般變數對待,即存在主存裡

 

3、暫存器變數的侷限性

魚和熊掌不可兼得,一般的,儲存裝置在獲得越高的速度的同時,其容量和其他引數可能會下降

例如暫存器,其速度是儲存裝置中最快的,但大小可能只有16位或32位(16bit、32bit)

相比較儲存裝置中幾乎最慢的外存,即硬碟(比如機械硬碟),目前容量1T(1024G)以上的硬碟已經是遍地開花了

就算同樣是硬碟,固態硬碟比機械硬盤獲得了更快的速度,但同時相等造價下的固態硬碟的容量確實普遍低於機械硬碟

回到register的話題,如果一個機器中暫存器的長度為32位,那麼我們就不能用其存放一個double型別的資料(64位)

即使同樣是整數型別,這樣的暫存器也不能存放long long這樣的型別,所以可以請求為register儲存的型別有侷限性

register的侷限和限制基本有這幾條:

(1)欲申請的register變數必須是CPU能接受的型別,其最好或必須是一個單值,儲存長度上要根據機器本身的暫存器而定

通常只能存整型長度及以下的型別的變數,也存在能存浮點型別的暫存器

(2)暫存器與記憶體不同,不可定址訪問,所以申請成功的register變數不能用&運算子定址

(3)具備申請為暫存器變數資格的只有區域性自動變數(auto類)和形參,全域性變數或區域性靜態變數不可申請為暫存器變數

(4)CPU的可用暫存器數量有限,所以最好不要隨意申請若干個暫存器變數,否則申請失敗的變數只能成為普通變數

 

——參考《C Primer Plus第五版》

 

相關文章:

C語言關鍵字淺析-auto

C語言關鍵字淺析-extern

C語言關鍵字淺析-static