??C++對象的內存模型涉及對象的數據成員(包括靜態成員和非靜態成員)、成員函數以及虛函數表等在內存中的布局和管理方式。以下是C++對象的內存模型的主要組成部分:
1. C++對象的組成
??一個C++對象通常由以下幾個部分組成:
- 非靜態數據成員
對象的核心組成部分,每個對象都有自己的一份獨立數據,存儲在內存中。 - 靜態數據成員
屬于類本身,而不是任何具體的對象,所有對象共享同一份內存。 - 成員函數
不存儲在對象的內存中,而是存儲在代碼段中。所有對象共享同一份成員函數代碼。 - 虛函數表指針(vptr)
如果類有虛函數,每個對象會包含一個指向虛函數表(vtable)的指針,通常作為對象的一部分存儲。
2. 內存布局
??C++對象在內存中的布局大致如下:
a. 普通類對象(無虛函數)
??對于沒有虛函數的普通類對象,內存中只包含非靜態數據成員,按照它們的聲明順序分配空間(編譯器可能會對齊數據以優化性能)。
class A {int x; // 4字節(假設int是4字節)char y; // 1字節,但會對齊為4字節
};int main() {A obj; // 占用8字節:4字節x + 1字節y + 3字節對齊
}
b. 有虛函數的類對象
??如果類中有虛函數,每個對象會額外增加一個虛函數表指針(vptr)。虛函數表存儲在類的靜態存儲區域中,所有對象共享該表。
class B {int x;