C語言中重要的關鍵字有很多,static const extern我們之前都講過,還有一個在面試中出現的頻率也比較高:register。
register翻譯過來是寄存器的意思,可以在定義變量的時候加在前面,我們把它稱作寄存器變量。
寄存器變量的作用在于提高程序的運行效率。
我們經常用到的存儲介質大概有這么幾種,硬盤、內存、緩存、寄存器,越往上訪問速度越快,當然價格也越高。
?
運行程序的時候,計算機會把大部分的數據存放在內存中,然后CPU會從內存中讀取需要的數據。
雖然訪問內存的速度比訪問硬盤來的快,但是跟CPU的速度比起來,還是慢了很多。
于是C語言就有了register關鍵字,被register修飾的變量很有可能放在寄存器中,這樣,CPU就能直接從寄存器中讀取變量,提高程序的運行效率。
對于需要頻繁訪問的變量,可以把它聲明成寄存器變量。
寫個代碼試試:
int main() { int i; for(i= 0; i < 10000000; i++); ???? ????printf("helloworld "); ???? return 0; }i作為循環變量,會被頻繁訪問。
先是不加register,編譯的時候不優化。
root@Turbo:test# gcc test.c -o test -O0 root@Turbo:test#如果不加這個-O選項,有些編譯器可能把這樣的for循環當作廢話優化掉。
運行的時間大概是這樣的:
root@Turbo:test# time ./test hellowrold real 0m0.021s user 0m0.020s sys 0m0.000s root@Turbo:test#然后修改代碼,在i的前面加上register:
int main() { register int i; for (i = 0; i < 10000000; i++); printf("helloworld "); return 0; }再次編譯運行,時間確實會縮短很多:
root@Turbo:test# gcc test.c -o test -O0 root@Turbo:test# time ./test hellowrold real 0m0.004s user 0m0.000s sys 0m0.004s root@Turbo:test#關于register關鍵字,有個經典的面試題,就是寄存器變量不能做取地址操作?
register int i; &i;C語言中的取地址操作取的是內存的地址,變量放在寄存器中不存在地址這一說法,如果強行取地址,編譯就會報錯。
root@Turbo:test# gcc test.c -o test -O0 test.c: In function ‘main’: test.c:8:2: error: address of register variable ‘i’ requested 8 | &i; | ^ root@Turbo:test#最后,register關鍵字還容易存在一個誤區:既然register能提高程序的運行效率,那能不能把所有的變量都聲明成register?
這個肯定不行,因為寄存器容量畢竟有限,聲明的太多,寄存器根本放不下。
所以少量的還行,都聲明成register,并沒有效果。
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5336瀏覽量
120232 -
C語言
+關注
關注
180文章
7604瀏覽量
136697 -
緩存器
+關注
關注
0文章
63瀏覽量
11658 -
for循環
+關注
關注
0文章
61瀏覽量
2502
原文標題:regiseter關鍵字
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論