天天看點

c++對象模型 記憶體布局

比如一個類:

class T

{

public:

   void Func();

   virtual void Func2();

private:

    int a;

    int b;

};

sizeof(T)的大小,如果沒有虛函數,那麼隻有資料成員存儲在資料段,那麼其大小就相當于struct T{int a; int b;};的大小。如果沒有任何資料成員,sizeof會傳回1.

當加入虛函數之後,類需要存儲一個虛表指針,指向一個虛函數表。那麼sizeof的大小需要再加上一個指針的大小。每個函數值有一個虛表,新的虛函數會添加到虛表中。虛表會被子類所繼承,擁有自己的虛函數表。這裡的繼承是指,父類定義了一個虛函數,那麼子類即使不定義虛函數,給出父類的虛函數的實作,他也會擁有一個虛函數表,裡面包含有父類的虛函數。

注意如果在類中或者結構體中加入一個static成員,sizeof不計算其大小的。類的static成員,即使在子類中也是共享父類的。即如果父類中有一個staic成員,那麼子類與父類都隻有這一個實體。