C 的記憶體模型以及命名空間 namespace

2021-10-05 17:11:49 字數 2070 閱讀 1655

1.儲存連續性

在c++中使用四種不同的方案來儲存資料

2.靜態成員變數的記憶體分配

如果乙個類中有靜態成員(static),注意,不能在類的宣告中初始化靜態成員,這是因為宣告只是描述了如何分配記憶體,而並沒有分配記憶體,所以,對於靜態成員的初始化,需要在類的宣告之外進行

所以,靜態成員在類的宣告中宣告,在包含類方法的檔案中初始化 ,初始化時應使用作用域運算子來指出靜態成員所屬的類

3.靜態持續變數的分類

int global = 1;    //該自動變數為全域性變數,鏈結性為外部,可以在該程式的其他檔案中使用

static int a = 1; //該靜態變數的鏈結性為內部,只能在包含該**的檔案中使用

int main()

void func1()

這也就是為什麼,靜態變數即使沒有被執行,也會分配記憶體的原因,這是和區域性自動變數的乙個區別 

補充:全域性自動變數和全域性靜態變數的乙個最主要的區別就是:全域性變數可以跨檔案使用,而全域性靜態變數只能在該**的檔案中使用

(1)靜態持續性--外部鏈結性

鏈結性為外部的變數成為外部變數,他們的儲存持續性是靜態的,作用域為整個檔案,是在所有函式外部定義的,因此,外部變數也稱為全域性變數,這是相對於區域性自動變數而言的

如何使用外部變數,c++規定,每個變數的定義只能有一次,所以提供了兩種變數的宣告

(2)靜態持續性--內部鏈結

如果將作用域為整個檔案的變數變為靜態的,也就是內部鏈結的靜態變數,就不會與其他檔案中作用域為全域性的同名變數產生衝突

(3) 靜態持續性--內部鏈結

在**塊內部使用static限定符的變數,該變數只能在該**塊中使用,在兩次呼叫函式之間,靜態區域性變數的值不會發生變化,適合再生

4.說明符與限定符

(1)說明符:

(2)cv-限定符:const與volatile

(3)mutable

即使結構或者變數為const,也可以被修改

5.函式與鏈結性

c++中規定,不允許在函式中定義另乙個函式,所以,所有函式的儲存持續性都是靜態的,也就是在程式的整個執行過程中都是存在的

可以再函式前加上static進行限定,表明,該函式是只適用於所在的程式檔案的,是內部鏈結的,並且,可以在其他檔案中宣告同名函式,而不發生衝突

注意:對於所有的外部函式,只能定義一次,這是c++的單定義規則

6.儲存方案與動態分配

在c++中,編譯器使用三塊記憶體來分別儲存變數

(1)靜態變數的儲存----靜態儲存區

(2)自動變數的儲存----棧

(3)動態記憶體分配(malloc/new)-----堆

這裡先討論動態記憶體的分配

7.命名空間 

命名空間簡單的講就是為了防止名稱發生衝突的

namespace jill

}namespace jack

}

此時,上面兩個命名空間中的a與函式pola不會發生衝突,可以使用作用域解析運算子::來限定其名稱

C 記憶體模型與命名空間

hpp檔案與.h檔案都是header檔案,但是.hpp檔案中包含了函式實現,減少了需要編譯的.cpp檔案數量。在ide中,不要將標頭檔案加入到專案列表中,只需源 標頭檔案由 include指令管理。為什麼.hpp中包括模板函式的實現,當該.hpp檔案被多個cpp用 include包含,鏈結時不會出現...

c 記憶體模型和命名空間

一 標頭檔案 1.c 程式一般分為3部分 標頭檔案 實現標頭檔案的原始檔 呼叫函式的原始檔 2.標頭檔案常包含的內容 1 函式原型 2 使用 define或者const定義的符號常量 被宣告為const的資料具有特殊的鏈結屬性 外部 內部 無 具備的鏈結性為內部,其作用域為包含標頭檔案的當前原始檔 ...

記憶體模型和命名空間

編譯器將分配固定的記憶體塊來儲存所有的靜態變數,這些變數在整個程式執行過程中一直存在。另外,如果沒有顯示的初始化靜態變數,編譯器將把它設為0,在預設情況下,靜態陣列和結構將每個元素或成員變數的所有位都設定為0 定義方式 1 外 必須在 塊的外面宣告它,可使用external修飾也可省略 2 內 必須...