int i;for(i=0; i<1000; i++)
為了解決這個問題,可以將使用頻繁的變數放在cpu的通用暫存器中,這樣使用該變數時就不必訪問記憶體,直接從暫存器中讀取,大大提高程式的執行效率。
為了加深對 register 變數的理解,這裡有必要講一下cpu暫存器。
暫存器是最貼近cpu的,而且cpu只在暫存器中進行訪問。寄存的意思是暫時存放資料,不用每次都從記憶體中取,它是乙個臨時
的存放資料的空間。
那麼為什麼還需要快取呢?因為如果頻繁地操作記憶體中同一位址上的資料會影響速度,於是就在暫存器和記憶體之間設定乙個緩
存,把使用頻繁的資料暫時儲存到快取,如果暫存器需要讀取記憶體中同一位址上的資料,就不用大老遠地再去訪問記憶體,直接
從快取中讀取即可。
注意:快取的容量是有限的,暫存器只能從快取中讀取到部分資料,對於使用不是很頻繁的資料,會繞過快取,直接到記憶體中
讀取。所以不是每次都能從快取中得到資料,這就是快取的命中率,能夠從快取中讀取就命中,否則就沒命中。
register 變數
來看乙個計算 π 的近似值的例子,求解的乙個近似公式如下:
為了提高精度,迴圈的次數越多越好,可以將迴圈的增量控制定義為暫存器變數,如下所示:
#include #include int main()res *= 4;
printf("pi is %f", res);
getch();
return 0;
}
關於暫存器變數有以下事項需要注意:
1) 為暫存器變數分配暫存器是動態完成的,因此,只有區域性變數和形式引數才能定義為暫存器變數。
3) 暫存器的長度一般和機器的字長一致,所以,只有較短的型別如int、char、short等才適合定義為暫存器變數,諸如double等較大的型別,不推薦將其定義為暫存器型別。
4) cpu的暫存器數目有限,因此,即使定義了暫存器變數,編譯器可能並不真正為其分配暫存器,而是將其當做普通的auto變數來對待,為其分配棧記憶體。當然,有些優秀的編譯器,能自動識別使用頻繁的變數,如迴圈控制變數等,在有可用的暫存器時,即使沒有使用 register 關鍵字,也自動為其分配暫存器,無須由程式設計師來指定。
c語言中register型別的變數
關鍵字regiter請求編譯器盡可能的將變數存在cpu的暫存器中。有以下幾點注意的地方。register變數必須是能被cpu暫存器所接受的型別,這通常意味著register變數必須是乙個單個的值,並且其長度應小於或等於整型的長度。但是,有些機器的暫存器也能存放浮點數。register變數可能不存放在...
C語言中的register關鍵字
在c語言中的register修飾的變數表示將此變數儲存在cpu的暫存器中,由於cpu訪問暫存器比訪問記憶體快很多,可以大大提高運算速度。但在使用register時有幾點需要注意。1.用register修飾的變數只能是區域性變數,不能是全域性變數。cpu的暫存器資源有限,因此不可能讓乙個變數一直佔著c...
c 對c語言中 register關鍵字增強
1 register關鍵字的變化 1 register關鍵字請求 編譯器 將區域性變數儲存於暫存器中 c語言中無法取得register變數位址,c 中可以取得register變數的位址 2 在c 中依然支援register關鍵字,c 編譯器有自己的優化方式,不使用register也可能做優化 3 c...