閱讀980 返回首頁    go 阿裏雲 go 技術社區[雲棲]


自動、靜態、 寄存器、易失變量的區別 .

(一)自動變量  

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

/* 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的連接性為內部鏈接,隻能在定義他的文件內使用。還有如果你在定義靜態變量的時候並沒有給變量初始化,則靜態變量將被自動初始化為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)強製訪存操作,防止編譯器去優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存.


最後更新:2017-04-03 22:15:32

  上一篇:go 《鋒利的SQL》實例
  下一篇:go 全排列算法原理和實現