C語言中register類型的變量有什么意義


 

int i;
for(i=0; i<1000; i++){
    // Some Code
}


為了解決這個問題,可以將使用頻繁的變量放在CPU的通用寄存器中,這樣使用該變量時就不必訪問內存,直接從寄存器中讀取,大大提高程序的運行效率。

為了加深對 register 變量的理解,這里有必要講一下CPU寄存器。

寄存器是最貼近CPU的,而且CPU只在寄存器中進行存取。寄存的意思是暫時存放數據,不用每次都從內存中取,它是一個臨時

的存放數據的空間。

那么為什么還需要緩存呢?因為如果頻繁地操作內存中同一地址上的數據會影響速度,於是就在寄存器和內存之間設置一個緩

存,把使用頻繁的數據暫時保存到緩存,如果寄存器需要讀取內存中同一地址上的數據,就不用大老遠地再去訪問內存,直接

從緩存中讀取即可。

注意:緩存的容量是有限的,寄存器只能從緩存中讀取到部分數據,對於使用不是很頻繁的數據,會繞過緩存,直接到內存中

讀取。所以不是每次都能從緩存中得到數據,這就是緩存的命中率,能夠從緩存中讀取就命中,否則就沒命中。

 

register 變量


來看一個計算 π 的近似值的例子,求解的一個近似公式如下:

為了提高精度,循環的次數越多越好,可以將循環的增量控制定義為寄存器變量,如下所示:

 

#include <stdio.h>
#include <conio.h>

int main()
{
    register int i = 0;  // 寄存器變量
    double sign = 1.0, res = 0, ad = 1.0;

    for(i=1; i<=100000000; i++)
    {
        res += ad;
        sign=-sign;
        ad=sign/(2*i+1);
    }

    res *= 4;
    printf("pi is %f", res);

    getch();
    return 0;
}


關於寄存器變量有以下事項需要注意:
1) 為寄存器變量分配寄存器是動態完成的,因此,只有局部變量和形式參數才能定義為寄存器變量。

3) 寄存器的長度一般和機器的字長一致,所以,只有較短的類型如int、char、short等才適合定義為寄存器變量,諸如double等較大的類型,不推薦將其定義為寄存器類型。
4) CPU的寄存器數目有限,因此,即使定義了寄存器變量,編譯器可能並不真正為其分配寄存器,而是將其當做普通的auto變量來對待,為其分配棧內存。當然,有些優秀的編譯器,能自動識別使用頻繁的變量,如循環控制變量等,在有可用的寄存器時,即使沒有使用 register 關鍵字,也自動為其分配寄存器,無須由程序員來指定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM