歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言register關鍵字

C語言register關鍵字

日期:2017/3/1 9:56:30   编辑:Linux編程

這裡還是稍微先一下auto這個關鍵字吧

auto:它很寬恆大量的,你就當它不存在吧。編譯器在默認的缺省情況下,所有變量都是auto 的。一語代過。。。

register:這個關鍵字請求編譯器盡可能的將變量存在CPU 內部寄存器中而不是通過內存尋址訪問以提高效率。注意是盡可能,不是絕對。你想想,一個CPU 的寄存器也就那麼幾個或幾十個,你要是定義了很多很多register 變量,它累死也可能不能全部把這些變量放入寄存器吧,輪也可能輪不到你。

皇帝身邊的小太監----寄存器

不知道什麼是寄存器?那見過太監沒有?沒有?其實我也沒有。沒見過不要緊,見過就麻煩大了。^_^,大家都看過古裝戲,那些皇帝們要閱讀奏章的時候,大臣總是先將奏章交給皇帝旁邊的小太監,小太監呢再交給皇帝同志處理。這個小太監只是個中轉站,並無別的功能。

那我們再聯想到我們的CPU。CPU 不就是我們的皇帝同志麼?大臣就相當於我們的內存,數據從他這拿出來。那小太監就是我們的寄存器了(這裡先不考慮CPU 的高速緩存區)。數據從內存裡拿出來先放到寄存器,然後CPU 再從寄存器裡讀取數據來處理,處理完後同樣把數據通過寄存器存放到內存裡,CPU 不直接和內存打交道。這裡要說明的一點是:小太監是主動的從大臣手裡接過奏章,然後主動的交給皇帝同志,但寄存器沒這麼自覺,它從不主動干什麼事。一個皇帝可能有好些小太監,那麼一個CPU 也可以有很多寄存器,不同型號的CPU 擁有寄存器的數量不一樣。

為什麼要這麼麻煩呢?速度!就是因為速度。寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內存快得多。進水樓台先得月嘛,它離CPU 很近,CPU 一伸手就拿到數據了,比在那麼大的一塊內存裡去尋找某個地址上的數據是不是快多了?那有人問既然它速度那麼快,那我們的內存硬盤都改成寄存器得了呗。我要說的是:你真有錢!

register修飾符暗示編譯程序相應的變量將被頻繁地使用,如果可能的話,應將其保存在CPU的寄存器中,以加快其存儲速度。例如下面的內存塊拷貝代碼,還是看看實例比較實在:

  1. /* Procedure for the assignment of structures, */
  2. /* if the C compiler doesn't support this feature */
  3. #ifdef NOSTRUCTASSIGN
  4. memcpy (d, s, l)
  5. {
  6. register char *d;
  7. register char *s;
  8. register int i;
  9. while (i--)
  10. *d++ = *s++;
  11. }
  12. #endif
/* 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
但是使用register修飾符有幾點限制
(1)register變量必須是能被CPU所接受的類型。這通常意味著register變量必須是一個單個的值,並且長度應該小於或者等於整型的長度。不過,有些機器的寄存器也能存放浮點數。最好不要這樣去用
(2)因為register變量可能不存放在內存中,所以不能用“&”來獲取register變量的地址。
(3)只有局部自動變量和形式參數可以作為寄存器變量,其它(如全局變量)不行。在調用一個函數時占用一些寄存器以存放寄存器變量的值,函數調用結束後釋放寄存器。此後,在調用另外一個函數時又可以利用這些寄存器來存放該函數的寄存器變量。所以說不要用register修飾全局變量等,因為他長時間的占用寄存器不允許再被使用了。
(4)局部靜態變量不能定義為寄存器變量。不能寫成:register static int a, b, c,同樣的道理,因為static變量函數結束不會被銷毀,下面進入還會使用之前的數據,生命周期直到程序退出才結束,數據存放在靜態區。
(5)由於寄存器的數量有限(不同的cpu寄存器數目不一),不能定義任意多個寄存器變量,而且某些寄存器只能接受特定類型的數據(如指針和浮點數),因此真正起作用的register修飾符的數目和類型都依賴於運行程序的機器,而任何多余的register修飾符都將被編譯程序所忽略。

注意:
  早期的C編譯程序不會把變量保存在寄存器中,除非你命令它這樣做,這時register修飾符是C語言的一種很有價值的補充。然而,隨著編譯程序設計技術的進步,在決定哪些變量應該被存到寄存器中時,現在的C編譯環境能比程序員做出更好的決定。實際上,許多編譯程序都會忽略register修飾符,因為盡管它完全合法,但它僅僅是暗示而不是命令。
知道這個關鍵字就可以了,也許你沒有必要去用他。
Copyright © Linux教程網 All Rights Reserved