1. 程式人生 > >C++中變數的作用域與生命週期

C++中變數的作用域與生命週期

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

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

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

全域性變數

  • 作用域:全域性作用域(全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。)
  • 生命週期:程式執行期一直存在
  • 引用方法:其他檔案中要使用必須用extern 關鍵字宣告要引用的全域性變數。
  • 記憶體分佈:全域性資料區
  • 注意:如果在兩個檔案中都定義了相同名字的全域性變數,連接出錯:變數重定義
  • 例子:

全域性靜態變數

  •  作用域:檔案作用域(只在被定義的檔案中可見。)
  • 生命週期:程式執行期一直存在
  • 記憶體分佈:全域性資料區
  • 定義方法:static關鍵字,const 關鍵字
  • 注意:只要檔案不互相包含,在兩個不同的檔案中是可以定義完全相同的兩個靜態變數的,它們是兩個完全不同的變數
  • 例子:

靜態區域性變數

  • 作用域:區域性作用域(只在區域性作用域中可見)
  • 生命週期:程式執行期一直存在
  • 記憶體分佈:全域性資料區
  • 定義方法:區域性作用域用中用static定義
  • 注意:只被初始化一次,多執行緒中需加鎖保護
  • 例子:

區域性變數

  • 作用域:區域性作用域(只在區域性作用域中可見)
  • 生命週期:程式執行出局部作用域即被銷燬
  • 記憶體分佈:棧區
  • 注意:auto指示符標示

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

Tips:

  1. 若全域性變數僅在單個C檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;
  2. 若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;
  3. 設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;
  4. 如果我們需要一個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶“內部儲存器”功能的的函式)
  5. 函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的地址作為返回值,若為auto型別,則返回為錯指標。

來CSDN很久了,一直都想寫點東西,今天終於出手了。水平有限,只能跟大家分享一些基礎知識的總結,以共勉,共同提升。

2010-05-2900:18:07