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

2021-10-02 12:57:32 字數 2485 閱讀 5423

簡介:

c++ 使用三種(c++11之後是四種)不同的方案來儲存資料,這些方案的區別就在於資料保留在記憶體中的時間。

詳解:

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

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

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

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

簡介:

作用域:描述了名稱在檔案多大範圍內可見。

詳解:

(1)函式中定義的變數可在該函式中使用,但不能在其他函式中使用;

(2)檔案中的函式定義之前定義的變數,可在所有函式中使用;

簡介:詳解:

外部鏈結性:鏈結性為外部的名稱可在多個檔案間共享

內部鏈結性:鏈結性為內部的名稱只能由乙個檔案中的函式共享

無鏈結性:自動變數的名稱沒有鏈結性,因為它們不能共享

簡介:

有一種形式的鏈結性被稱為語言鏈結性,它也對函式有影響。鏈結程式要求每個不同的函式都有不同的符號名。

詳解:

c語言:乙個名稱只對應乙個函式,為滿足內部需求,c語言編譯器可能將spiff這樣的函式名翻譯為_spiff,這種方法被稱為c語言鏈結性

c++語言:c++中,同乙個名稱可能對應多個函式(例如過載函式),如何將這些函式翻譯為不同的符號名稱?c++編譯器執行名稱矯正名稱修飾,為過載函式生成不同的符號名稱。例如:c++

編譯器可能將spiff(int)轉換為_spiff_i,而將spiff(double, double)轉換為_spiff_d_d,這種方法被稱為c++語言鏈結性。

疑問1:

如果要在c++程式中使用c庫中預編譯的函式,將出現什麼情況?假設有如下的函式:

spiff(22);

它在c庫檔案中的符號名稱是_spiff,但對於假設的鏈結程式是c++程式的話,c++查詢約定是查詢符號名稱_spiff_i,與c庫中函式符號名稱不一致。

解決1:

為解決疑問1這種問題,可以用函式原型來指出要使用的約定:

extern

"c"void

spiff

(int);

// 使用c語言規則查詢函式

extern

void

spiff

(int);

// 使用c++語言規則查詢函式

extern

"c++"

void

spiff

(int);

// 使用c++語言規則查詢函式

第乙個原型使用c語言鏈結性。

第二個原型是通過預設方式指出使用c++語言鏈結性。

第三個原型顯示地指出使用c++語言鏈結性。

補充:

名稱矯正或名稱修飾:它根據函式原型中指定的形參型別對每個函式名進行加密,例如下述未經修飾的函式原型:

long

myfunctionfoo

(int

,float

);

編譯器將名稱轉換為不太好看的內部表示,來描述該介面,如下所示:

?myfunctionfoo@@yaxh
對原始名稱進行的表面看起來無意義的修飾(或矯正)將對引數數目和型別進行編碼。新增的一組符號隨函式特徵標而異,而修飾時使用的約定隨編譯器而異

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

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

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

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

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

資料摘自 c primer plus 儲存持續性 1自動儲存持續性 在函式定義中宣告的變數 包括函式引數 的儲存持續性為自動的。它們在程式開始執行其所屬的函式或 塊時被建立,在執行完函式或 塊時,它們使用的記憶體被釋放。2靜態儲存持續性 在函式定義外定義的變數和使用關鍵字static定義的變數的儲存...