第九章 記憶體模型和命名空間

2021-10-16 11:32:57 字數 2518 閱讀 3093

一、

1.標頭檔案中內容:函式原型、#define與const常量、結構宣告、類宣告、模板宣告、內聯函式

2.防止重複定義,防止二次包含,#ifndef #endif

3.多個庫鏈結,兩個編譯器可能為同乙個函式生成不同修飾名稱,最好是同乙個編譯器編譯生成的庫。

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

1.儲存資料方案:自動儲存,靜態儲存static,執行緒儲存thread_local,動態儲存new,存放於heap堆。

2.作用域,名稱在檔案的多大範圍可見;鏈結性,描述了名稱如何在不同單元間共享。

3.auto用於c++,自動型別推斷。c語言為自動作用域。

4.棧,記憶體儲存方向為,自下向上增長

5.register暫存器變數,訪問速度較快。

6.static變數,外部鏈結性:全域性,內部鏈結性:檔案內部static,無鏈結性:函式內部。未初始化的靜態變數為0。

7.constexpr建立常量表示式的方式

8.靜態持續性,外部鏈結性,(1)使用::訪問全域性變數。例如區域性定義了warming,全域性也定義了warming,可使用::warming訪問全域性。其他情況,區域性會覆蓋全域性。(2)extern宣告訪問,單一定義原則。

9.volatile去除編譯器優化,編譯器將值儲存至暫存器中,volatile每次從記憶體中取值。

10.mutable,即使結構或類的為const,某個成員也可能被修改。

11.const修改全域性變數的鏈結性為內部,相當於static。其他檔案呼叫需加extern,但是每個檔案有同一組常量,是屬於自己的。

12.extern const int states = 50;預設加const,修改常量的鏈結性為內部,但可用extern覆蓋,此時其他檔案共享常量。

13.函式鏈結性:單定義規則,用於非內聯函式。內聯函式可防在標頭檔案中,包含了標頭檔案的每個檔案都有乙份內聯函式的定義。

14.語言鏈結性:

(1)c++將函式翻譯時,執行名稱矯正或名稱修飾。c只是翻譯。

extern 「c」 void

spiff

(int);

//c語言方式

extern

void

spiff

(int);

//隱式c++

extern 「c」 void

spiff

(int);

//顯式c++

15.動態儲存

(1)new失敗時不會返回空指標,引發異常std::bad_alloc

(2)原型

void

*operator

new(std::size_t)

;void

*operator

new[

](std::size_t)

;

(3)定位new運算子

a、預設從heap上分配,也可指定地點申請滿足大小的記憶體塊。

b、例1為常規,例2為buffer中申請int,例3為buffer中申請40個int。

int

*p1 =

newint

;//new(sizeof(int))

int*p2 =

new(buffer)

int;

//new(sizeof(int), buffer)

int*p3 =

new(buffer)

int[40]

;//new(40*sizeof(int), buffer),都為接收2個引數。

c、delete只可刪除常規申請的記憶體,對於定位new,不可刪除,會段錯誤。

三、命名空間

1.宣告區域 > 潛在作用域,潛在作用域可能會被區域性變數覆蓋。

2.命名空間特性,開放的,後續可追加。

3.不可位於**塊中,通過作用域解析運算子::訪問。

4.using 編譯指令和using宣告。宣告可使乙個變數可用,編譯指令使得所有名稱都可用。

編譯指令,增加了名稱衝突的可能性。

using jill::fetch;

//覆蓋區域性變數

using

namespace jill;

//使用所有名稱

5.採用編譯指令包含整個命名空間後,可定義區域性變數,全域性變數,訪問命名空間變數。分別採用,區域性,::全域性,命名空間::變數的形式。

6.作用域不同,覆蓋的範圍不同。

(1)使用using宣告將命名空間的名稱匯入宣告區域,報錯。

(2)使用using編譯指令將命名空間的名稱匯入宣告區域,區域性版本將隱藏命名空間版本。

7.(1)巢狀使用命名空間(2)open是可傳遞的(3)建立別名,namespace a = b;簡化對巢狀命名空間的呼叫。(4)未命名的命名空間,僅可在宣告點到該宣告區域結尾。不可使用using呼叫,不可在其他檔案中呼叫。

8.using宣告匯入函式名,不需要描述返回型別和特徵標。如果函式被過載,全部匯入。

9.盡可能少的使用using編譯,盡可能多的使用命名空間。

c primer 第九章 記憶體模型和命名空間

一,單獨編譯 1 請不要將函式定義或變數宣告放到標頭檔案中。原因 乙個標頭檔案中包含乙個函式定義,然後其他兩個檔案 同屬於乙個程式 包含該標頭檔案,則同乙個程式中將包含同乙個函式定義。除非函式是內聯的 inline 否則將出錯。2 將結構放在標頭檔案中是可以的。因為它們不建立變數。3 標頭檔案寫法 ...

第九章 虛擬記憶體

計算機的主存被組織成乙個由m個連續的位元組大小的單元組成的陣列。每個位元組都有乙個唯一的實體地址 pa 第乙個位元組位址為0,接下來為1,再接下來為2,依次類推。cpu訪問記憶體的最自然方式就是使用實體地址。我們把這種方式稱為物理定址。如圖所示。現代處理器使用一種稱為虛擬位址的定址方式。使用虛擬定址...

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...