這裡還是稍微先一下auto這個關鍵字吧
auto:它很寬恆大量的,你就當它不存在吧。編譯器在默認的缺省情況下,所有變量都是auto 的。一語代過。。。
register:這個關鍵字請求編譯器盡可能的將變量存在CPU 內部寄存器中而不是通過內存尋址訪問以提高效率。注意是盡可能,不是絕對。你想想,一個CPU 的寄存器也就那麼幾個或幾十個,你要是定義了很多很多register 變量,它累死也可能不能全部把這些變量放入寄存器吧,輪也可能輪不到你。
皇帝身邊的小太監----寄存器
不知道什麼是寄存器?那見過太監沒有?沒有?其實我也沒有。沒見過不要緊,見過就麻煩大了。^_^,大家都看過古裝戲,那些皇帝們要閱讀奏章的時候,大臣總是先將奏章交給皇帝旁邊的小太監,小太監呢再交給皇帝同志處理。這個小太監只是個中轉站,並無別的功能。
那我們再聯想到我們的CPU。CPU 不就是我們的皇帝同志麼?大臣就相當於我們的內存,數據從他這拿出來。那小太監就是我們的寄存器了(這裡先不考慮CPU 的高速緩存區)。數據從內存裡拿出來先放到寄存器,然後CPU 再從寄存器裡讀取數據來處理,處理完後同樣把數據通過寄存器存放到內存裡,CPU 不直接和內存打交道。這裡要說明的一點是:小太監是主動的從大臣手裡接過奏章,然後主動的交給皇帝同志,但寄存器沒這麼自覺,它從不主動干什麼事。一個皇帝可能有好些小太監,那麼一個CPU 也可以有很多寄存器,不同型號的CPU 擁有寄存器的數量不一樣。
為什麼要這麼麻煩呢?速度!就是因為速度。寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內存快得多。進水樓台先得月嘛,它離CPU 很近,CPU 一伸手就拿到數據了,比在那麼大的一塊內存裡去尋找某個地址上的數據是不是快多了?那有人問既然它速度那麼快,那我們的內存硬盤都改成寄存器得了呗。我要說的是:你真有錢!
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但是使用register修飾符有幾點限制