簡介:
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定義的變數的儲存...