天天看點

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

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

1. 類中成員函數布局

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

(1)隻含有普通成員函數的類

一個類也相當于一個作用域。對于不含虛函數的類而言,成員函數可以被看作是類作用域的全局函數,不在對象配置設定的空間裡。也就是說類中普通成員函數對類記憶體大小沒有影響。

那麼問題來了:通過一個類對象調用成員函數,如果确定這個成員函數屬于這個類呢?

對象調用成員函數時,在編譯期,編譯器就可以确定這些函數的位址,并通過傳入this指針和其他參數,完成函數的調用,是以類中就沒有必要存儲成員函數的資訊。

(2)含有虛函數的類

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

類中的虛函數隻能通過vptr調用。

2.類中成員變量的布局

(1)成員變量在類中記憶體的先後順序與其在類中被聲明的先後順序一緻,也就是說先聲明的變量在記憶體的前邊。

(2)類中成員變量初始化的先後順序與其聲明先後順序一緻,與constructor中被初始化先後順序無關。

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

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

繼續閱讀