2010年10月26日 星期二

變數的等級


變數的等級(變數的生存空間和生命週期)
C語言,我們可以將變數的等級分為下列幾種
(1) auto
(2) static
(3) external
(4) static external
(5) register
auto變數的宣告被使用在某個區段內,所以這類變數宣告稱為『區域變數』。auto變數是用堆疊方式佔用記憶體空間,因此當執行完此區段程式以後,堆疊空間則被系統收回,因此變數就消失了。所以該區段即為此變數的生存空間(scope),一般指的就是 { } 內的程式區段。
由於C的編譯程式,假設所有未指明變數的等級的變數皆為auto,所以平常使用都沒有看到auto這個關鍵字。
static的變數宣告,是屬於靜態生命週期,與auto不同在於,C編譯程式是以固定位址存放這個變數,而不是以堆疊的方式,在程式開始執行時的準備階段產生此變數儲存空間,並在程式結束時刪除,所以只要整個程式仍然繼續執行,這個變數將不會隨著執行區段結束就消失了。
另外靜態生命週期變數,即使沒有賦予初始化值時,系統也會自動以0來初始化。
外在變數(external)是指定義在程式外部的變數,當一個變數被定義為外在變數,所有其他的函數或程式區段皆可以引用這個變數。如果外在變數在某個區段內被重新定義,則在這個區段內的變數值以該區段的變數為參考值,其他區段則仍然以外在變數為參考值。是故外在變數又稱為這些函數或程式區段的global變數。
如程式或函數分別撰寫在不同的檔案裡,如果檔案A要參考檔案B的外在變數,則可以在檔案A裡以extern這個關鍵字宣告即可。
靜態外在變數(static external)和上述的外在變數,最大的差異是,當變數在檔案A裡以static關鍵字宣告為靜態外在變數,則其他的檔案想要引用為不合法,也就是說『靜態外在變數只能供宣告此變數的檔案使用』。
使用register(暫存器)宣告資料的主要目的,為告知C編譯器將此宣告的變數放入暫存器內,以加快程式的執行速度。話雖如此,由於暫存器的個數上有限制,所以這個指令僅是建議編譯器這樣做,但不一定會被搬進去暫存器執行,因此有時候系統的暫存器已經被系統佔據,系統會自動配置auto變數給你。
在編譯技術較進步的現在,編譯器會自動判斷那個變數該存放在暫存器,來達到程式的最佳化(也有少數的編譯器會在程式執行時,動態改變存放於暫存器的變數),所以進行register宣告的意義變的越來越淡薄了。

沒有留言:

張貼留言