先說兩個概念:作用域(scope) 和生命週期(lifetime)
作用域: 名字的作用域指的是知道該名字的程式文字區域
生命週期:物件的生命週期指在程式執行過程中物件存在的時間
全域性物件, 顧名思義是全域性的物件,其作用域是整個程式文字,其物件的宣告週期是整個程式的執行過程;
區域性物件: 一般說的區域性變數都指的是動態區域性變數,包括形參,某個語句塊中定義的變數等。 動態區域性變數是自動物件, 呼叫時建立,呼叫完成後自動撤銷。 其作用域是區域性的(某個塊) , 其生命週期也是區域性的。
靜態局物件: 作用域是區域性的, 生命週期是全域性的, 通過在區域性變數前加static 指定。
eg.size_t count_calls()
static size_t ctr =0;
return ++ctr;
int main()
for(size_t i =0; i!=10; ++i)
coutctr 是靜態區域性物件, 其作用域是區域性的(count_calls()函式中), 但其生命週期是整個程式執行期。
靜態區域性物件在第一次呼叫函式時初始化, 只初始化一次
ps.引用網上比較全面的總結
對乙個c++變數來說,有兩個屬性非常重要:作用域和生命週期,它們從兩個不同的維度描述了乙個變數--時間和空間。顧名思義,作用域就是乙個變數可以被引用的範圍,如:全域性作用域、檔案作用域、區域性作用域;而生命週期就是這個變數可以被引用的時間段。不同生命週期的變數,在程式記憶體中的分布位置是不一樣的。乙個程式的記憶體分為**區、全域性資料區、堆區、棧區,不同的記憶體區域,對應不同的生命週期。
有很多方法來指定乙個變數的作用域和生命週期。最常見的,如:、static修飾符等。下面按照作用域與生命週期來對變數做乙個分類:
全域性變數
[cpp]
int g_ivalue = 1;
extern int g_ivalue;
int main()
全域性靜態變數
[cpp]
const int ivalue_1;
static const int ivalue_2;
static int ivalue_3;
int main()
靜態區域性變數
[cpp]
void function()
區域性變數
還有一點要說明,掌握static關鍵字的使用很關鍵。以下是引用別人的一些經驗之談:
tips:
若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;
若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;
設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;
如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶「內部儲存器」功能的的函式)
函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。
C 之區域性物件(自動物件和靜態區域性物件)
1 自動物件 預設情況下,區域性變數的生命期侷限於所在函式的每次執行期間。只有當定義它的函式被呼叫時才存在的物件稱為自動物件。自動物件在每次呼叫函式時建立和撤銷。該型別區域性變數儲存在棧上,在動態儲存區。區域性變數所對應的自動物件在函式控制經過變數定義語句時建立。如果在定義時提供了初始化,那麼每次建...
C語言 全域性?靜態全域性?區域性?靜態區域性
全域性變數 儲存在靜態區,程式執行的整個過程一直占用記憶體。所有檔案所有函式都可以使用 使用extern宣告 比較靈活。正是因為多個地方都可讀可寫,是乙個很危險的事,因為不知道某個時刻誰會將它改變,而且導致程式不方便移植。適當使用全域性變數還是有很多好處的,只是不推薦濫用全域性變數 區域性變數 除了...
區域性物件和全域性物件
在語塊句中定義的物件稱為區域性物件,包括函式的形參。區域性物件僅在相應的語句塊內部可見,而且還會遮蔽外層作用域中的同名物件。1 自動物件 自動物件的生命期開始於定義語句的執行,結束於作用域的結尾處。函式形參是自動物件,進入函式時被分配儲存空間,函式執行結束時消亡。對於未初始化的區域性物件,值為隨機值...