C 物件模型解析二

2021-08-07 19:06:33 字數 1022 閱讀 4574

編譯器對於物件構造過程的干涉,以及對於程式形式和程式效率的衝擊

對於乙個class x,如果沒有任何user-declared constructor,那麼會有乙個預設的constructor被隱式的宣告出來....乙個被隱式宣告出來的建構函式是乙個trivial constructor(無用的constructor)。

編譯器會合成non-trivival constructor 的4中情況:

1.帶有"default constructor"的member class object

由於類中帶有自帶預設建構函式的成員變數,所以初始化這些物件是編譯器的責任,所以這時候編譯器會合成non-trivial constructor完成對成員變數的初始化,但是需要注意的是,如果成員變數還帶了int 或者指標,編譯器是沒有責任對他進行初始化的,所以這些變數時為被初始化的。

如果這個類已經有了建構函式,但是並沒有顯示的呼叫成員變數的預設建構函式,那麼編譯器也需要會為這些函式安插構造這些成員變數的函式。

2.帶有「default constructor」的base class

這個跟帶有de****t constructor 的member class object的情況一致的 呼叫這些基類的函式是編譯器的責任 所以編譯器會合成non-trivial建構函式,同樣如果派生類定義了建構函式,那麼編譯器也會為這些建構函式安插相應基類初始化**。

3.帶有虛函式的class

編譯器有責任為每乙個帶有虛函式的物件設定vptr初始值,放置適當的虛表的位址。如果類已經定義了建構函式也要安插相應的虛指標的初始化**。

4.帶有乙個虛基類的類

編譯器有責任初始化相應的虛基類指標。安插相應**

以上四種情況,會造成"編譯器必須未宣告constructor的class合成乙個預設建構函式"。c++標準把那些合成物稱為implicit nontrivial default contructor。 

C 物件模型解析三

複製建構函式的操作 像default constructor一樣 如果乙個class沒有宣告乙個複製建構函式,就會有隱式的宣告出現。跟之前一樣,c 標準會把複製建構函式分為有用的以及無用的,只有有用的例項才會被合成到程式之中,決定乙個copy constructor是否是trivial的標準在於cl...

C 之物件模型二

c 程式設計之記憶體模型 c 程式在執行時,將記憶體大方向劃分為四個區域 區 存放函式體的二進位制 由作業系統進行管理的 全域性區 存放全域性變數 靜態變數和常量 棧區 由編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統收回 ...

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...