2015年6月1日 星期一

[C] auto 與 register

C語言變數儲存等級(storage class),一共有四種:auto、extern、register、static,我們最常用的是auto,然而卻很少人用它來宣告變數,怎麼說起來很奇怪?因為編譯器自動把我們宣告的變數自動設成auto,只是我們都忽略有這回事。看個例子:
1
2
int i;
auto int i;
以上兩者的意義相同,auto變數在程式執行的時候,OS配置記憶體空間給這個變數。
現在我們來討論register變數,跟auto變數一樣,register變數在程式執行的時候,OS會配置記憶體空間給此變數,但跟auto變數不一樣的是,register變數會被配置到CPU中的暫存器(register),而auto變數會被配置到RAM中,它們的差異在於存取速度,前者(register)快於後者(RAM),那到底快多少呢?我看到網路上都說「快」,但到底有多快?我們實際來測試看看吧~
1
for(register int i=0;i<1000000000;i++);
我舉我們最常使用的for迴圈,讓它空轉10的9次方次,我的電腦執行時間為:
2.98905059209784340000
請按任意鍵繼續 . . .
而去掉register宣告,結果則為:
3.03692563877645630000
請按任意鍵繼續 . . .
雖然看起來只有差0.05秒左右,但你若宣告long long的話,差異就更明顯了。不過當今電腦速度這麼快,誰會在乎這麼一點時間呢?
結論就是驗證了儲存裝置的層級:register存取速度優於RAM。前者量少而貴但相對較快,後者則相反。

文章出處 : https://cg2010studio.wordpress.com/2011/04/08/register-variable/

沒有留言:

張貼留言