類中成員記憶體分布

2021-09-24 05:18:36 字數 1212 閱讀 2888

static修飾成員變數

對於非靜態資料成員,每個類物件都有自己的拷貝。而靜態資料成員被當做是類的成員,無論這個類被定義了多少個,靜態資料成員都只有乙份拷貝,為該型別的所有物件所共享(包括其派生類)。所以,靜態資料成員的值對每個物件都是一樣的,它的值可以更新。

因為靜態資料成員在全域性資料區分配記憶體屬於本類的所有物件共享,所以它不屬於特定的類物件,在沒有產生類物件前就可以使用。

static修飾成員函式

與普通的成員函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。從這個意義上來說,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,只能呼叫其他的靜態成員函式

static修飾的成員函式,在**區分配記憶體

c++多型分為靜態多型和動態多型。靜態多型是通過過載和模板技術實現,在編譯的時候確定。動態多型通過虛函式和繼承關係來實現,執行動態繫結,在執行的時候確定。

動態多型實現有幾個條件:

(1) 虛函式;

(2) 乙個基類的指標或引用指向派生類的物件;

基類指標在呼叫成員函式(虛函式)時,就會去查詢該物件的虛函式表。虛函式表的位址在每個物件的首位址。查詢該虛函式表中該函式的指標進行呼叫。

每個物件中儲存的只是乙個虛函式表的指標,c++內部為每乙個類維持乙個虛函式表,該類的物件的都指向這同乙個虛函式表。

虛函式表中為什麼就能準確查詢相應的函式指標呢?因為在類設計的時候,虛函式表直接從基類也繼承過來,如果覆蓋了其中的某個虛函式,那麼虛函式表的指標就會被替換,因此可以根據指標準確找到該呼叫哪個函式。

如果乙個類是區域性變數則該類資料儲存在棧區,如果乙個類是通過new/malloc動態申請的,則該類資料儲存在堆區。

如果該類是virutal繼承而來的子類,則該類的虛函式表指標和該類其他成員一起儲存。虛函式表指標指向唯讀資料段中的類虛函式表虛函式表中存放著乙個個函式指標,函式指標指向**段中的具體函式

如果類中成員是virtual屬性,會隱藏父類對應的屬性。

C 中類的資料成員和成員函式記憶體分布

對齊理由 1 移植原因。某些平台只能在特定位址處取特定資料值。2 效能原因。訪問未對齊的記憶體,處理器需要額外的訪問次數。有的平台從偶位址開始讀,如果資料從奇位址開始讀,那麼需要訪問兩次。跟物理性質有關,記憶體分一塊一塊等大小的,盡量將單個資料儲存在乙個物理儲存上,便於電訊號讀取。1 空型別 cla...

C 中類的記憶體分布

如何計算類物件占用的位元組數?乙個空類的話1個位元組。這是為了保證n個連續空類宣告時,變數位址有偏移,防止變數覆蓋。非空類的話用關鍵字sizeof計算。如果手工計算就相當麻煩,光padding就一堆規則了。而且有些額外資訊比如虛函式 多個虛函式也只產生乙個vptr指標 等等。乙個類成員 當有虛函式時...

C 類記憶體分布

成員變數依據宣告的順序進行排列 類內偏移為0開始 成員函式不佔記憶體空間 上部分為成員變數,下部分為虛表 當建立乙個含有虛函式的父類的物件時,編譯器在物件構造時將虛表指標指向父類的虛函式 同樣,當建立子類的物件時,編譯器在建構函式裡將虛表指標 子類只有乙個虛表指標,它來自父類 指向子類的虛表 這個虛...