register 型別修飾符
一、皇帝身邊的小太監----暫存器
不知道什麼是暫存器?那見過太監沒有?沒有?其實我也沒有。沒見過不要緊,見過就麻煩大了。^_^,大家都看過古裝戲,那些皇帝們要閱讀奏章的時候,大臣總是先將奏章交給皇帝旁邊的小太監,小太監呢再交給皇帝同志處理。這個小太監只是個中轉站,並無別的功能。
好,那我們再聯想到我們的CPU。CPU 不就是我們的皇帝同志麼?大臣就相當於我們的記憶體,資料從他這拿出來。那小太監就是我們的暫存器了(這裡先不考慮CPU 的快取記憶體區)。資料從記憶體裡拿出來先放到暫存器,然後CPU 再從暫存器裡讀取資料來處理,處理完後同樣把資料通過暫存器存放到記憶體裡,CPU 不直接和記憶體打交道
為啥要這麼麻煩啊?速度!就是因為速度。暫存器其實就是一塊一塊小的儲存空間,只不過其存取速度要比記憶體快得多。進水樓臺先得月嘛,它離CPU 很近,CPU 一伸手就拿到資料了,比在那麼大的一塊記憶體裡去尋找某個地址上的資料是不是快多了?那有人問既然它速度那麼快,那我們的記憶體硬碟都改成暫存器得了唄。我要說的是:你真有錢!
二、舉例
register修飾符暗示編譯程式相應的變數將被頻繁地使用,如果可能的話,應將其儲存在CPU的暫存器中,以加快其儲存速度。
#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
register char *d;
register char *s;
register int i;
while (i--)
*d++ = *s++;
}
#endif
三、使用register 修飾符的注意點
但是使用register修飾符有幾點限制。
首先,register變數必須是能被CPU所接受的型別。這通常意味著register變數必須是一個單個的值
其次,因為register變數可能不存放在記憶體中,所以不能用“&”來獲取register變數的地址。
由於暫存器的數量有限,而且某些暫存器只能接受特定型別的資料(如指標和浮點數),因此真正起作用的register修飾符的數目和型別都依賴於執行程式的機器,而任何多餘的register修飾符都將被編譯程式所忽略。
在某些情況下,把變數儲存在暫存器中反而會降低程式的執行速度。因為被佔用的暫存器不能再用於其它目的;或者變數被使用的次數不夠多,不足以裝入和儲存變數所帶來的額外開銷。
早期的C編譯程式不會把變數儲存在暫存器中,除非你命令它這樣做,這時register修飾符是C語言的一種很有價值的補充。然而,隨著編譯程式設計技術的進步,在決定那些變數應該被存到暫存器中時,現在的C編譯環境能比程式設計師做出更好的決定。實際上,許多編譯程式都會忽略register修飾符,因為儘管它完全合法,但它僅僅是暗示而不是命令。