c 類的記憶體布局

2021-08-07 11:42:59 字數 687 閱讀 1338

c++中的struct需要記憶體對齊, 便於機器訪問該struct。

每個物件(如果類含有虛函式)在首位址位置放置了vptr,指向自己的虛函式表。物件中不包含成員函式(靜態的或非靜態的),它們可以被物件共享,靜態成員函式沒有this指標,所以不能被物件呼叫,non-static 成員函式隱含有乙個this指標。

c++程式的記憶體格局通常分為四個區:

全域性資料區(data area),**區(code area),棧區(stack area),堆區(heap area)(即自由儲存區)。全域性資料區存放全域性變數,靜態資料和常量;所有

類成員函式和非成員函式**存放在**區;為執行函式而分配的區域性變數、函式引數、返回資料、返回位址等存放在棧區;餘下的空間都被稱為堆區。根據這個解釋,我們可以得知在類的定義時,類成員函式是被放在**區,而類的靜態成員變數在類定義時就已經在全域性資料區分配了記憶體,因而它是屬於類的。對於非靜態成員變數,我們是在類的例項化過程中(構造物件)才在棧區或者堆區為其分配記憶體,是為每個物件生成乙個拷貝,所以它是屬於物件的。

base *p=new drived(); vprt和vtable是在建構函式中完成的,右邊生成了乙個派生類物件,p指向這塊記憶體,呼叫p時就是使用子類的vptr訪問函式,這樣就實現了多型。

而inline函式是在編譯時呼叫處插入函式**,免去了函式的呼叫開銷。

c 類的記憶體布局

本文基本上是對於stanley b.lippman的inside the c object model一書第一章第三章的概括,描述了c 類的記憶體布局情況.c 的類的記憶體布局有如下規則 1.nonstatic data member 存放在class object中 2.static data m...

c 的類的記憶體布局

c 的類的記憶體布局有如下規則 1.nonstatic data member 存放在class object中 2.static data member,static nonstatic member function存放在 class object之外.所有例項執行於32 位機器上測試 規則1和...

C 類繼承記憶體布局

c 類繼承記憶體布局 c 繼承分為兩種,普通繼承和虛擬繼承 virtual 具體的繼承又根據父類中的函式是否virtual而不同。下面就單繼承分為幾種情況闡述 1.普通繼承 父類無virtual函式 若子類沒有新定義virtual函式 此時子類的布局是 由低位址 高位址 為父類的元素 沒有vptr ...