C語言register關鍵字的使用
register:這個關鍵字請求編譯器儘可能的將變量存在CPU內部寄存器中,而不是通過內存尋址訪問,以提高效率。注意是儘可能,不是絕對。你想想,一個CPU 的寄存器也就那麼幾個或幾十個,你要是定義了很多很多register 變量,它累死也可能不能全部把這些變量放入寄存器吧,輪也可能輪不到你。關於該關鍵字你瞭解多少呢?下面是相關的知識,歡迎閲讀。
一、皇帝身邊的小太監----寄存器不知道什麼是寄存器?那見過太監沒有?沒有?其實我也沒有。沒見過不要緊,見過就麻煩大了。^_^,大家都看過古裝戲,那些皇帝們要閲讀奏章的時候,大臣總是先將奏章交給皇帝旁邊的小太監,小太監呢再交給皇帝同志處理。這個小太監只是箇中轉站,並無別的功能。
好,那我們再聯想到我們的CPU。CPU 不就是我們的皇帝同志麼?大臣就相當於我們的內存,數據從他這拿出來。那小太監就是我們的寄存器了(這裏先不考慮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修飾符,因為儘管它完全合法,但它僅僅是暗示而不是命令。
-
C語言合併排序及實例代碼
歸併排序也稱合併排序,其算法思想是將待排序序列分為兩部分,依次對分得的兩個部分再次使用歸併排序,之後再對其進行合併。下面是小編分享的C語言合併排序及實例代碼,一起來看一下吧。合併排序僅從算法思想上了解歸併排序會覺得很抽象,接下來就以對序列A[0],A[l]…,A...
-
C語言學習攻略
導語:C語言作為最流行的程序設計語言,是任何一個計算機專業及其愛好者們都必須掌握的一門編程語言。下面就由小編為大家介紹一下C語言學習攻略,歡迎大家閲讀!一、C語言學習中存在的問題(一)基礎薄弱,無法適應C語言學習的課程通常安排在大一,這個時候,學生們剛剛進入...
-
C語言指針的長度和類型講解
對於初學者深入理解C語言程序設計有很好的參考價值,下面是小編為大家整理的C語言指針的長度和類型講解,歡迎參考~一般來説,如果考慮應用程序的兼容性和可移植性,指針的長度就是一個問題,在大部分現代平台上,數據指針的長度通常是一樣的,與指針類型無關,儘管C標準沒有規...
-
如何使用C語言求N的階乘
使用C語言求N的階乘的方法是很多小夥伴都想知道的,下面小編給大家介紹如何使用C語言求N的階乘,歡迎閲讀!如何使用C語言求N的階乘用遞歸法求N的.階乘程序調用自身稱為遞歸(recursion).它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求...