c 中類中成員在記憶體中的布局

2021-08-02 09:55:48 字數 848 閱讀 7515

本篇部落格來分析c++中類成員的記憶體布局情況。首先我們來分析下成員函式的記憶體布局,然後分析下類中成員變數的記憶體布局。

1. 類中成員函式布局

c++類中的成員函式包括有虛函式和普通成員函式。首先我們先來討論下沒有虛函式的類中成員函式是如何布局的。

(1)只含有普通成員函式的類

乙個類也相當於乙個作用域。對於不含虛函式的類而言,成員函式可以被看作是類作用域的全域性函式,不在物件分配的空間裡。也就是說

類中普通成員函式對類記憶體大小沒有影響。

那麼問題來了:

通過乙個類物件呼叫成員函式,如果確定這個成員函式屬於這個類呢?

物件呼叫成員函式時,在編譯期,編譯器就可以確定這些函式的位址,並通過傳入this指標和其他引數,完成函式的呼叫,所以類中就沒有必要儲存成員函式的資訊。

(2)含有虛函式的類

如果乙個類中含有虛函式的話,在類記憶體中一開始就會有乙個vptr(虛指標)。這個虛指標指向乙個虛表,虛表是由類中指向虛函式的指標構成的陣列。vptr是在類的constructor中被初始化,這是由系統決定的,我們無法改變。

類中的虛函式只能通過vptr呼叫。

2.類中成員變數的布局

(1)成員變數在類中記憶體的先後順序與其在類中被宣告的先後順序一致,也就是說先宣告的變數在記憶體的前邊。

(2)類中成員變數初始化的先後順序與其宣告先後順序一致,與constructor中被初始化先後順序無關。

(3)如果類中含有虛函式,那麼類中第乙個位置的變數是vptr。

(4)類大小的是在編譯期間就被確定了,所以sizeof可以作用與乙個類名。

C程式在記憶體中的布局

程式在記憶體中的分布 程式執行後在記憶體中分為4部分 區,資料區,堆區和棧區 源 已初始化的變數 未初始化的變數 堆空間 棧空間 命令列引數和環境變數 記憶體空間主要是堆疊 堆從低位址向高位址增長 棧從高位址向低位址增長。棧空間是靜態的儲存空間 函式的引數,函式的區域性變數儲存在棧區,函式呼叫時,需...

程式在記憶體中的布局

c語言程式在記憶體中的分布 段 text 存放著程式的機器碼和唯讀資料 常量 全域性區 靜態區 由編譯器編譯時分配,程式執行結束後釋放 屬於靜態記憶體分配 在程式的二進位制檔案中,bss段不佔儲存空間,只有在載入到記憶體中才分配 data段 存放已初始化的靜態變數 static 修飾 和全域性變數 ...

C 類在記憶體中的分配

在網上看到這樣一道題 答案是24位元組。做這道題要理解三個知識點 一 32位和64位作業系統的區別 32位和64位指的是cpu一次處理資料的能力是32位還是64位,這裡涉及到的是處理器運算位數。簡單的說32位系統的位址匯流排是32位的,而64位系統的位址匯流排是64位的,這意味著乙個指標所占用的空間...