變數的生命週期

2021-07-22 08:35:14 字數 1321 閱讀 8635

from:

今天在論壇上看到有朋友發帖問道:既然靜態全域性變數與全域性變數都儲存在全域性資料區,為什麼作用域卻不一樣呢?也許答案非常簡單:c++就是這麼規定的,靜態全域性變數與全域性變數的唯一區別就是作用域不同。

對乙個c++變數來說,有兩個屬性非常重要:作用域和生命週期,它們從兩個不同的維度描述了乙個變數--時間和空間。顧名思義,作用域就是乙個變數可以被引用的範圍,如:全域性作用域、檔案作用域、區域性作用域;而生命週期就是這個變數可以被引用的時間段。不同生命週期的變數,在程式記憶體中的分布位置是不一樣的。乙個程式的記憶體分為**區、全域性資料區、堆區、棧區,不同的記憶體區域,對應不同的生命週期。

有很多方法來指定乙個變數的作用域和生命週期。最常見的,如:、static修飾符等。下面按照作用域與生命週期來對變數做乙個分類:

全域性變數

[cpp]view plain

copy

intg_ivalue = 1;  

extern

intg_ivalue;  

intmain()    

全域性靜態變數

[cpp]view plain

copy

const

intivalue_1;  

static

const

intivalue_2;  

static

intivalue_3;  

intmain()    

靜態區域性變數

[cpp]view plain

copy

void

function()    

區域性變數

還有一點要說明,掌握static關鍵字的使用很關鍵。以下是引用別人的一些經驗之談:

tips:

若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;

如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶「內部儲存器」功能的的函式)

函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。 

變數的生命週期

1 全域性變數 作用域 全域性作用域 只需要在乙個原始檔中定義,就可以作用於所有的原始檔 生命週期 程式執行期一直存在 記憶體分布 全域性 靜態儲存區 注意 如果再兩個檔案中都定義了相同名字的全域性變數,則連線錯誤 變數重定義。2 全域性靜態變數 生命週期 程式執行期一直存在 作用域 檔案作用域 只...

switch case 變數生命週期

case 2 新增圖書 system.out.println n圖書資訊列表 system.out.print 請輸入新增圖書名稱 string name input.next 是否能新增圖書,如果貨架滿了 6 則無法新增false能新增true boolean flagadd false for ...

c變數的生命週期

內部變數 生命週期 函式結束時結束.作用域 宣告的花括號中.儲存區域 棧記憶體區域.不會自動初始化.但會申請空間.外部變數 生命週期 和程式的生命週期一樣.作用域 程式的所以地方做可以使用,但需要使用extren進行宣告.儲存區域 在全域性區域.自動初始化.並生命自身的儲存空間.內部靜態變數 生命週...