register關鍵字介紹

2021-08-17 20:46:26 字數 1229 閱讀 4307

1、register修飾符暗示編譯程式相應的變數將被頻繁地使用,如果可能的話,應將其儲存在cpu的暫存器中,

以加快其儲存速度。例如下面的記憶體塊拷貝**,

/* procedure for the assignment of structures, */

/* if the c compiler doesn't support this feature */

#ifdef nostructassign

memcpy (d, s, l)

#endif

2、但是使用register修飾符有幾點限制

register變數必須是能被cpu所接受的型別。

這通常意味著register變數必須是乙個單個的值,並且長度應該小於或者等於整型的長度。不過,有些機器的暫存器也能存放浮點數。

因為register變數可能不存放在記憶體中,所以不能用「&」來獲取register變數的位址。

只有區域性自動變數和形式引數可以作為暫存器變數,其它(如全域性變數)不行。

在呼叫乙個函式時占用一些暫存器以存放暫存器變數的值,函式呼叫結束後釋放暫存器。此後,在呼叫另外乙個函式時又可以利用這些暫存器來存放該函式的暫存器變數。

區域性靜態變數不能定義為暫存器變數。不能寫成:register static int a, b, c;

由於暫存器的數量有限(不同的cpu暫存器數目不一),不能定義任意多個暫存器變數,而且某些暫存器只能接受特定型別的資料(如指標和浮點數),因此真正起作用的register修飾符的數目和型別都依賴於執行程式的機器,而任何多餘的register修飾符都將被編譯程式所忽略。

注意:早期的c編譯程式不會把變數儲存在暫存器中,除非你命令它這樣做,這時register修飾符是c語言的一種很有價值的補充。然而,隨著編譯程式設計技術的進步,在決定哪些變數應該被存到暫存器中時,現在的c編譯環境能比程式設計師做出更好的決定。實際上,許多編譯程式都會忽略register修飾符,因為儘管它完全合法,但它僅僅是暗示而不是命令。

在c++中依然支援register關鍵字;

c++編譯器有自己的優化方式,不使用register也可能做優化;

c++中可以取得register變數的位址;

c++編譯器發現程式中需要取register變數的位址時,register對變數的宣告變得無效。

示例**:

#include #include using namespace std;

int main()

register 關鍵字解析

include void main 和下面的 void main 有什麼區別啊 還有就是register在什麼情況下用呀?前邊程式中的i是預設的自動變數 auto 自動變數在程式呼叫的時候是分配臨時的儲存空間,呼叫的時候也是從記憶體中呼叫的,這也是和register最大的不同,register變數的...

關鍵字volatile和register

用關鍵字volatile宣告變數,是用來告訴編譯器每次對此變數的引用都需要從記憶體位址中讀取,即取消編譯器對此變數的優化編譯。當某次引用沒用volatile宣告的變數時,其被編譯器從記憶體位址中讀取到ax 某通用暫存器 中,那麼在其後的引用中,如果ax暫存器沒用被改變,那麼編譯器會優化成直接讀取ax...

C語言關鍵字register

功能 用關鍵字register修飾變數,是想將變數變成暫存器變數,儲存在cpu的內部暫存器中,省去了cpu從記憶體抓取資料的時間,提高了程式的執行效率。適用型別 頻繁被訪問的變數或迴圈變數可以用register修飾 對編譯系統而言,只是 建議性的,而非指令性的 注意事項 1 register只能修飾...