C 變數的儲存持續性 作用域和鏈結性

2021-07-09 05:22:24 字數 1937 閱讀 3105

資料摘自《c++ primer plus》

儲存持續性

1自動儲存持續性:在函式定義中宣告的變數(包括函式引數)的儲存持續性為自動的。它們在程式開始執行其所屬的函式或**塊時被建立,在執行完函式或**塊時,它們使用的記憶體被釋放。

2靜態儲存持續性:在函式定義外定義的變數和使用關鍵字static定義的變數的儲存持續性都為靜態。(請注意)它們在整個執行過程中都存在。

3執行緒儲存持續性(c++11):當前,多核處理器很常見,這些cpu可同時處理多個執行任務。這讓程式能夠將計算放在可並行處理的不同執行緒中。如果變數是使用關鍵字thread_local宣告的,則其生命週期與所屬的執行緒一樣長。

4動態儲存持續性:用new運算子分配的記憶體將一直存在,直到使用delete運算子將其釋放或程式結束為止。這種記憶體的儲存持續性為動態,有時被稱為自由儲存(free store)或堆(heap)。

作用域和鏈結性

作用域(scope)描述了名稱在檔案的多大範圍內可見。例如,函式中定義的變數可在該函式中使用,但不能在其他函式中使用;而在檔案中的函式定義之前定義的變數則可在所有函式中使用。

鏈結性(linkage)描述了名稱如何在不同單元間共享。鏈結性為外部的名稱可在檔案間共享,鏈結性為內部的名稱只能由乙個檔案中的函式共享,自動變數的名稱沒有鏈結性,因為它們不能共享。

預設情況下,在函式中宣告的函式引數和變數的儲存持續性為自動,作用域為區域性,沒有鏈結性。

靜態儲存持續性變數提供了3種鏈結性:外部鏈結性(可在其他檔案中訪問)、內部鏈結性(只能在當前檔案中訪問)和無鏈結性(只能在當前函式或**塊中訪問)。這3種鏈結性都在整個程式執行期間存在,與自動變數相比,它們的壽命更長。由於靜態變數的數目在程式執行期間是不變的,因此程式不需要使用特殊的裝置(如棧)來管理它們。編譯器將分配固定的記憶體塊來儲存所有的靜態變數,這些變數在整個程式執行期間一直存在。如果沒有顯式地初始化靜態變數,編譯器將把它設定為0。預設情況下,靜態陣列和結構將每個元素成員的所有位都設定為0。

下面列出5種變數儲存方式

儲存描述

持續性作用域

鏈結性如何宣告

1 自動

自動**塊

無在**塊中

2 暫存器

自動**塊

無在**塊中,使用關鍵字register

3 靜態,無鏈結性

靜態**塊

無在**塊中,使用關鍵字static

4 靜態,外部鏈結性

靜態檔案

外部不在任何函式內

5 靜態,內部鏈結性

靜態檔案

內部不在任何函式內,使用關鍵字static

示例說明

extern int cats = 20; //屬於第4種儲存方式(下面為了方便直接寫上第幾種)

int dogs = 22; //第4種

int fleas; //第4種(預設設定值為0)

static int errors = 5; //第5種

void f1(int n)

...//下面使用的cats,dogs,fleas都來自file1.cpp

extern int cats;

extern int dogs;

extern int fleas;

static int errors = 2; //第5種(雖然在file1.cpp中也定義了同名稱的靜態變數,但它只能在當前檔案中訪問,所有兩者不衝突,它們是不同的兩個變數)

void f2(int n)

...//下面是錯誤的示範

//單定義規則(one definition rule,odr):該規則指出,變數只能有一次定義。

int dogs = 3; //第4種,但這是錯誤的,因為它違反了單定義規則,這裡它試圖建立另乙個同名的外部變數

...

變數儲存持續性 作用域和鏈結性

靜態持續變數3種鏈結性 外部鏈結性 可在其他檔案中訪問 內部鏈結性 只能在當前檔案中訪問 無鏈結性 只能在當前函式或 中訪問 要想建立鏈結性為外部或內部的靜態持續變數,必須在 塊外面宣告它,要建立沒有鏈結性的靜態持續變數,必須在 塊內宣告它。1.單定義規則 變數只能有一次定義,c 提供了兩種變數宣告...

儲存持續性 作用域和鏈結性

關於記憶體的知識 c 使用3種 c 11中是4種 不同的方案來儲存資料,這些方案的區別在於資料保留在記憶體中的時間。1.自動變數和棧 自動變數的數目隨函式的開始和結束而增減,因此程式必須在執行時對自動變數進行管理,常用的方法是留出一段記憶體,將其視為棧,以管理動態變數的增減。2.靜態持續變數 和c語...

C 儲存持續性 作用域與鏈結性

簡介 c 使用三種 c 11之後是四種 不同的方案來儲存資料,這些方案的區別就在於資料保留在記憶體中的時間。詳解 自動儲存持續性 在函式定義中宣告的變數 包括原函式引數 的儲存持續性為自動的。它們在程式開始執行其所屬的函式或 塊時被建立,在執行完函式或 塊時,它們使用的記憶體被釋放。靜態儲存持續性 ...