當前位置:才華齋>計算機>C語言>

關鍵字register分析

C語言 閱讀(5.89K)

C語言是一個有結構化程式設計、具有變數作用域(variable scope)以及遞迴功能的過程式語言。以下是小編為大家搜尋整理關鍵字register分析,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

關鍵字register分析

  1、register修飾符暗示編譯程式相應的變數將被頻繁地使用,如果可能的話,應將其儲存在CPU的暫存器中,以加快其儲存速度。例如下面的'記憶體塊拷貝程式碼,

/* Procedure for the assignment of structures, */

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

#ifdef NOSTRUCTASSIGN

memcpy (d, s, l)

{

register char *d;

register char *s;

register int i;

while (i--)

*d++ = *s++;

}

#endif

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

(1)register變數必須是能被CPU所接受的型別。

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

(2)因為register變數可能不存放在記憶體中,所以不能用“&”來獲取register變數的地址。

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

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

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

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

注意:

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