導航:首頁 > 源碼編譯 > 寄存器變數在編譯

寄存器變數在編譯

發布時間:2022-07-23 04:26:50

1. 什麼是寄存器什麼是寄存器變數

寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(ACC)。寄存器是內存階層中的最頂端,也是系統獲得操作資料的最快速途徑。寄存器通常都是以他們可以保存的位元數量來估量,舉例來說,一個 「8 位元寄存器」或 「32 位元寄存器」。寄存器現在都以寄存器檔案的方式來實作,但是他們也可能使用單獨的正反器、高速的核心內存、薄膜內存以及在數種機器上的其他方式來實作出來。 寄存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為 「架構寄存器」。寄存器是CPU內部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。
register[寄存器]變數告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。使用register存儲類型的目的一般是為了提高執行速度,但是,register聲明只是向編譯器所提出的「建議」,並非強制要求。

2. 編程里,自動變數和寄存器變數是怎麼回事

什麼是自動變數呢?自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回後,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
/* auto */
#include <stdio.h>

int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d\n",var);
return 0;
}

int print()
{
auto int i=0; /* 自動變數 */
i+=1;
printf("%d\n",i);
return i;
}

/* end */

靜態變數:
靜態變數與自動變數的本質區別是,靜態變數並不像自動變數那樣使用堆棧機制來使用內存。而是為靜態變數分配固定的內存,在程序運行的整個過程中,它都會被保持,而不會不銷毀。這就是說靜態變數的持續性是程序運行的整個周期。這有利於我們共享一些數據。如果靜態變數在函數內部定義,則它的作用域就是在這個函數內部,僅在這個函數內部使用它才有效,但是它不同於自動變數的,自動變數離開函數後就會別銷毀,而靜態變數不會被銷毀。他在函數的整個運行周期內都會存在。在函數外面定義的變數為全局變數,工程內的所有文件都可以訪問他,但是它在整個工程內只能定義一次,不能有重復的定義,不然就會發生錯誤,而其他的文件要想使用這個變數,必須用extern來聲明這個變數,這個聲明叫做引用聲明。這一點很重要,如過你沒有用extern 來聲明在其他文件中已經定義的全局變數,就來使用它,就會發生錯誤如果你只是想在定義他的文件中使用它,而不允許在其他的文件中使用它,那麼就用關鍵字 static來在函數外面聲明變數。這樣這個變數在其他文件中將不可見,即它的連接性而內部鏈接。有一點是我們只得注意的像:如果你在函數外這樣聲明一個變數,const int a ; 變數a的連接性為內部鏈接,只能在定義他的文件內使用。還有如果你在定義靜態變數的時候並沒有給變數初始化,則靜態變數將被自s動初始化為0;

/* static */
#include <stdio.h>

int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d",var);
return 0;
}

int print()
{
static int i; /*靜態變數 */
i+=1;
printf("%d\n",i);
return i;
}

/* end */

寄存器變數:
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能.但是寄存器變數不是強制性的,也就是,即使你使用register關鍵字去聲明一個變數為寄存器變數,編譯器還是有可能把它作為一個普通的變數而不是寄存器變數來使用的. 在我們寫程序的過程當中,有時候會經常用到一個全局變數,如果能夠把它作為寄存器變數來使用,顯然可以提高程序的性能,特別是對於那些對性能要求比較高的程序(比如模擬器,虛擬機等).拿X86平台來說,如果使用Gcc擴展,可以按照如下方式聲明一個全局寄存器變數,並指定它存入ebx寄存器:int ra asm("ebx");用作這種用途的還有「ebp, ebx, esi, edi".這時候需要在編譯程序的時候給出特別的選項,因為有些寄存器原本是另有用途的,比如ebp寄存器,原來是做frame-pointer用.

易失變數:
volatile:(嵌入式程序員必須掌握的)volatile最初的意思是表示汽油容易揮發,在c中的作用大概有兩點(1)表示變數是易失的,易變的. (2)強制訪存操作,防止編譯器去優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存.

3. C語言中可以定義寄存器變數到底可以定義多少空間的寄存器變數我該如何知道這個區域的大小

register是一個"建議"型關鍵字,意指程序建議該變數放在寄存器中,但最終該變數可能因為條件不滿足並未成為寄存器變數,而是被放在了存儲器中,所以可以不用糾結這個了。
如果你想了解有CPU多少寄存器,可參考下面資料:
新型 x86 處理器提供以下可以通過編譯器進行分配的寄存器:8 個 32 位的通用寄存器、8 個 80 位的浮點寄存器和 8 個 128 位的矢量寄存器。所有 x64 處理器提供 16 個 64 位的通用寄存器、8 個 80 位的浮點寄存器和至少 16 個矢量寄存器(每個矢量寄存器至少 128 位)。新型 32 位 ARM 處理器提供 15 個 32 位的通用寄存器和 32 個 64 位的浮點寄存器。所有 64 位的 ARM 處理器提供 31 個 64 位的通用寄存器、32 個 128 位的浮點寄存器和 16 個 128 位的矢量寄存器 (NEON)。

4. C語言中 自動變數 靜態變數 寄存器變數 外部變數 有可比性嗎區別在哪簡單易懂點吧~

c語言中變數分為四類,分別是
1.auto 自動變數
2.static 靜態存貯分配變數(又分為內部靜態和外部靜態)
3.extern 外部變數/全程變數(用於外部變數說明)
4.register 寄存器變數(分配在硬體寄存器中)
四大類,所有變數必須先說明(定義),後使用。

下面分別介紹
1.自動變數(局部變數)
局部變數:在一個函數開頭或段開頭處說明的變數,
它有幾個特徵,,
a、作用域為定義它的函數
b、編譯器不會對自動變數給予隱含的初值,故其值不確定,因此每次使用前必須明確的置初值。
c、形參是自動變數,作用域僅限於相應函數內
d、自動變數隨函數的引用而存在和消失,由一次調用到下一次調用之間不保持值。
2.外部變數:在函數外部定義的變數即為外部變數,它的作用域是整個程序(全程變數)。
a. c程序可以分別放在幾個文件上,每個文件可以作為一個編譯單位分別進行編譯。外部變數只需在某個文件上定義一次,其它文件若要引用此變數時,應用extern加以說明(外部變數定義時不必加extern關鍵字)。

b. 在同一文件中,若前面的函數要引用後面定義的外部(在函數之外)變數時,在函數里加extern加以說明。
引進外部變數的原因:解決函數單獨編譯的協調;與變數初始化有關;外部變數的值是永久的;解決數據共享;
注意:函數本身也被認為是外部變數
3.靜態變數:分為內部靜態變數和外部靜態變數
內部靜態變數:a.在局部變數前加上static就為內部靜態變數
b.靜態局部變數仍是局部變數,其作用域仍在定義它的函數范圍內,但它採用靜態存貯分配(由編譯程序在編譯時分配,而一般的自動變數和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變數並不撤銷,再次調用時,其值將繼續存在。
外部靜態變數:a.在函數外部定義的變數前加static即為外部靜態變數
b.作用域為定義它的文件,即成為該文件的私有變數,其他文件上的函數一律不得直接訪問,除非通過它所在文件上的函數進行操作,這可實現數據隱 藏。
4.寄存器變數:只有自動(局部)變數和函數參數才能進一步指定為寄存器存貯類
a.使用register變數可以提高存取速度,但寄存器變數的數目依賴於具體機器,聲明多了也只有前幾個有效。
b.只限於int,char,short ,unsigned和指針類型用寄存類。
c.不能對register變數取地址(即&操作)

5. C語言 register寄存器變數問題

因為register只是一個「建議性」的關鍵字,實際上編譯程序不一定會把指定的變數真的當寄存器處理:)

真正的寄存器是沒有地址的,但你下面做了取地址操作,所以這個「建議」就杯具了:)

6. C語言中的自動變數和寄存器變數是什麼

auto[自動]存儲類型 在代碼塊之間傳遞信息的一種方法就是使用外部變數。 當一個變數在函數的外部被聲明時,它的存儲空間是永久分配的, 它的存儲類型是extren. 外部變數的聲明看上去和函數或代碼塊內部所聲明的變數一樣。 外部變數對於它之後的所有函數都有效。在代碼塊或函數後, 外部變數仍然存在。 register[寄存器] 存儲類型告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。 使用register存儲類型的目的一般是為了提高執行速度, 但是,register聲明只是向編譯器所提出的「建議」, 並非強制要求。

7. C++中寄存器變數

寄存器變數不在內存中,在CPU的寄存器中.
只要用了register修飾符,對該變數取地址的操作就被禁止.你把變數定義成寄存器中,它會一直占著寄存器不釋放。計算機寄存器的個數是一定的。
這樣變數少的你可以用,變數多了就不夠用了。

而且即使你在內存中聲明的普通變數最終還是要放到寄存器中的去執行,而那時對寄存器的處理是不需要你管的,除非是對效率要求特高,而且只對狠少的固定的幾個變數處理,一般是不怎麼用的。

8. C語言中的自動變數和寄存器變數是什莫

C語言學習之變數存儲

C語言中對變數的說明包括兩方面的內容:變數類型以及變數的存儲類型。變數類型如:int(整形),char(字元型)是用來說明變數所佔用的內存空間的大小。變數存儲類型用來說明變數的作用范圍。

C語言的變數存儲類有:自動類、寄存器類、靜態類和外部類。

關鍵字auto加在變數名及其類型前,用來說明它是自動變數。局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進 行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上 從來不用。 局部變數在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這個變數也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自動消失。

static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1. 靜態局部變數
它與局部變數的區別在於: 在函數退出時, 這個變數始終存在, 但不能被其它
函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變數一樣。
2. 靜態全程變數
靜態 全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它源文件使用,而靜態全程變數卻不能再被說明為外部的, 即只能被所在的源文件使用。
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外, 還要 被其它文件使用。因此, 必須將全程變數通知每一個程序模塊文件, 此時可用 extern來說明。

寄存器變數to能夠長在執行速度很重要的情況下使用。其思想是告訴編譯程序把該變數放在一個CPU寄存器中。因為數據在寄存器中操作比在內存中快,這樣就提高了程序代碼的執行速度。寄存器變數的說明是在變數名及類型之前加上關鍵字register。值得注意的是取地址運算符&不能作用於寄存器變數。

file1.c

#include <stdlib.h>

#include <stdio.h>

int reset();

int next();

int last();

int sum(int );

int i=1;

void main()

{

auto int i,j;

i=reset();

for(j=1;j<=3;j++)

{

printf("i=%d\tj=%d\n",i,j);

printf("next(i)=%d\n",next());

printf("last(i)=%d\n",last());

printf("sum(i+j)=%d\n",sum(i+j));

}

}

file2.c文件

static int i=10;

int next()

{

return(i+=1);

}

int last()

{

return(i-=1);

}

int sum(int i)

{

static int j=5;

return(i=j+=i);

}

file3.c文件

extern int i;

reset()

{

return(i);

}

運行結果:

i=1 j=1

next(i)=11

last(i)=10

sum(i+j)=7

i=1 j=2

next(i)=11

last(i)=10

sum(i+j)=10

i=1 j=3

next(i)=11

last(i)=10

sum(i+j)=14

具體分析一下三個文件中的變數的種類。

在file1.c的開頭聲明i是外部變數,並出示化為1。而在main函數內部,說明了兩個自動變數i和j,這樣在main內部出現的i就是自動量。在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同一個變數,所以reset的值返回的就是這個i的當前值1。file2.c文件已開始就定義了變數i,並聲明為靜態變數,因此它的使用范圍只在當前文件中使用。然而從函數sum中定義來看,其內部用到的i是形式參數,j是內部靜態變數,它們與以前的i,j都不同。

具體執行過程分析如下:

首先程序經過編譯後聲稱可執行文件,運行可執行文件後,函數從Main函數體進入,在初始化的過程中得到i為全局變數,初值為1。進入main函數後首先調用函數reset(),進入文件file3.c,文件file3.c聲明i為外部變數,所以此時i的值為1,則返回的值為1。函數reset()執行完後返回主函數,繼續執行循環體中的程序。循環體首先調用函數next(),程序進入file2.c文件,判斷i為靜態變數,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當調用last()函數時,判斷i的值為11,執行函數後,i的值變為10,並將10作為i的值。最後執行函數sum(i),此時值的注意的是執行程序時傳遞的是形參,即第一次調用時實際計算的值為sum(i+j=2),這樣調用函數sum(i)後執行的結果為i=5+2=7,即為執行的結果。依次類推,分別為7,10,14。

通過以上的程序可以理解不同的存儲類型的作用范圍不同,在程序設計中如何靈活的使用各種不同的存儲類型是能夠使程序更靈活。

閱讀全文

與寄存器變數在編譯相關的資料

熱點內容
70個4相乘的簡便演算法 瀏覽:291
安卓手機沒有機身存儲了怎麼辦 瀏覽:314
輸入法文件夾不能用 瀏覽:83
發單買多大的雲伺服器 瀏覽:331
特價雲伺服器如何注冊 瀏覽:296
安卓手機賬戶忘記密碼怎麼解鎖 瀏覽:821
如何用健身app確定一個特工 瀏覽:911
多級壓縮的原理 瀏覽:864
java項目開發案例視頻 瀏覽:70
文件夾快速查找表格不同內容 瀏覽:493
合並排序演算法java 瀏覽:920
如何將文件夾刪除的部分恢復 瀏覽:808
eco為什麼連接不上伺服器 瀏覽:294
查看linux的命令是 瀏覽:12
蘋果郵件伺服器地址 瀏覽:343
U盤超級加密3000時間 瀏覽:738
如何跟別人解釋什麼是伺服器 瀏覽:939
安卓11原生如何隱藏軟體 瀏覽:712
解壓清潔面部女士 瀏覽:856
美的變頻空調壓縮啟動一下報p1 瀏覽:472