C語言變量存儲類型auto static extern static extern register

C語言變量存儲類型

auto
static
extern
static extern
register

auto 局部變量

auto 變量是用堆棧(stack)方式佔用儲存器空間,因此,當執行此區段是,系統會立即爲這個變量分配存儲器空間,而程序執行完後,這個堆棧立即被系統收回.在大括號{}內聲明.
自動變量就是指在函數內部定義使用的變量。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變量。自動變量是局部變量,即它的區域性是在定義他的函數內部有效。當然這說明自動變量也沒有鏈接性,因爲它也不允許其他的文件訪問他。由於自動變量在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變量,他們之間不會發生衝突的。因爲他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建併爲它分配內存,當函數執行完畢返回後,自動變量就會被銷燬。這個過程是通過一個堆棧的機制來實現的。爲自動變量分配內存就壓棧,而函數返回時就退棧。

static 靜態變量


一、局部靜態變量
局部變量按照存儲形式可分爲三種auto, static, register。
與auto類型(普通)局部變量相比, static局部變量有三點不同:
1. 存儲空間分配不同
auto類型分配在棧上, 屬於動態存儲 類別, 佔動態存儲區空間, 函數調用結束後自動釋放, 而static分配在靜態存儲 區, 在程序整個運行期間都不釋放. 兩者之間的作用域(有效範圍)相同, 但生存期不同.
2. static局部變量在所處模塊在初次運行時進行初始化工作, 且只操作一次
3. 對於局部靜態變量, 如果不賦初值, 編譯期會自動賦初值0或空字符 , 而auto類型的初值是不確定 的.
特點: static局部變量的”記憶性 ”與生存期的”全局性”
所謂”記憶性”是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.

注意事項:
1. “記憶性”, 程序運行很重要的一點就是可重複性, 而static變量的”記憶性”破壞了這種可重複性, 造成不同時刻至運行的結果可能不同.
2. “生存期”全局性和唯一性. 普通的local變量的存儲空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊內存, 這就造成一個很重要的問題 ---- 不可重入性!!!

二、外部靜態變量/函數
在C中static有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。, 但爲了限制全局變量/函數的作用域, 函數或變量前加static使得函數成爲靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅侷限於本文件(所以又稱內部函數 )。注意此時, 對於外部(全局)變量, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的.此時的static只是起作用域限制作用, 限定作用域在本模塊(文件)內部.
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。


extern 變量

外部變量 定義在程序外部,所有的函數很程序段都可以使用.

外部變量可能會在某一程序段被重新定義,以段內變量爲參考值.

static extern 變量

靜態外部變量和外部變量差別在於,外部變量生命可以同時給多個文件使用,而靜態外部變量則只能給聲明此變量的文件使用.

register 變量

寄存器變量,是由寄存器分配空間,訪問速度比訪問內存快,加快執行速度.寄存器大小有限.

在c語言當中可以使用寄存器變量來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變量聲明爲寄存器變量: register int ra; 如果可能的話,編譯器就會爲它分配一個單獨的寄存器,在整個函數執行期間對這個變量的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能。
不能用於全局變量。現在的情況是VC忽略用戶定義的REGISTER,因此定義一個REGISTER變量與不定義一個 REGISTER是一樣的,編譯器進行相同的優化,因爲MS認爲,REGISTER是系統中寶貴的資源,應該由系統統一調配,而且認爲VC編譯器的優化能力要大於一般的程序員。因此也有人說register關鍵字在PC機(x86CPU)無用,編譯器按自動變量處理。
注意: register是不能取址的。
register int j; int *p = &j;是錯的,因爲無法對寄存器的定址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章