C 物件模型 1 物件記憶體布局簡介

2021-08-27 09:38:00 字數 1599 閱讀 8556

我們知道當例項化乙個類時,也就是產生乙個物件時需要分配記憶體空間.那乙個物件具體需要多少位元組的記憶體空間? 通過些什麼規則計算出來的?

假如有如下乙個類

類宣告arwen.h

classarwen

public:

arwen(void);

virtual

~arwen(

void);

intage();

static

void

height(

int);

private:

intm_nage;

static

ints_nheight;

類原始檔arwen.cpp

#include

"arwen.h"

intarwen::s_nheight = 1; //記得初始化靜態變數

arwen::arwen(void

)arwen::~arwen(void

)intarwen::age ()

return

m_nage;

void

arwen::height(

inta)

s_nheight = a;

假如例項化上面這樣乙個類,在記憶體中是怎麼樣分配空間的呢?

我們知道乙個類包括成資料成員(data members)和成員函式(member functions).

資料成員分為static 和 nonstatic

成員函式分為static , nonstatic, virtual

資料成員記憶體分配

static變數是在靜態儲存區(有人也叫資料段)分配空間.而nonstatic變數則在物件中分配空間.

所以static

int s_nheight;是在靜態儲存區分配空間,不在物件空間的計算之內.int m_nage;就需要4位元組空間

成員函式記憶體分配

static和nonstatic成員函式都是在**區(或者叫文字段)中分配記憶體.也不在物件內容的計算之內.

virtual成員函式(不管多少個),都只都只會在物件中插入乙個指標,指向乙個virtual table(這是儲存在哪個地方?還沒搞懂),virtual table裡面儲存著一堆指標,乙個指標是指向型別資訊,其他的都指向虛函式的位址.虛函式本身跟static和nonstatic成員函式一樣是儲存在**區.

由於類arwen中有虛函式,所有編譯器會自動插入乙個指標指向virtual table,指標在32位系統上是4位.

所以例項化類arwen需要分配8位元組的記憶體空間.int m_nage的4位元組,加上指向虛表的指標4位元組.

你可以用sizeof(arwen)計算下就會發現結果是8.

不過其實有時一些特殊情況會結果未必就是這樣計算出來的值.例如乙個類沒有任何資料成員和虛成員函式,理就為0,但sizeof發現會是1,這是因為在記憶體中好歹要用點啥來唯一標誌乙個類.另外有時計算出來的值是7或其他啥不是2的整數倍,由於有個啥記憶體物件的機制(可能又會按成員資料對齊,整體對齊),最終sizeof的結果可能不太一樣.

記憶體對齊詳見:

C 物件模型 記憶體布局

聯絡人 石虎暱稱 嗡嘛呢叭咪哄 一 概念 1 沒有繼承情況,vptr存放在物件的開始位置,以下是base1的記憶體布局 m idata 100 2.單繼承的情況下,物件只有乙個vptr,它存放在物件的開始位置,派生類子物件在父類子物件的最後面,以下是d1的記憶體布局 b1 m idata 100 b...

1 1 物件模型

q1 c 的類有兩種資料成員 static 資料成員與 nonstatic 資料成員,有三種成員函式 static,nonstatic,virtual。q2 在虛繼承的情況下,base class不管在繼承串鏈中被派生多少次,永遠只會存在乙個例項 稱為subobject q3 c 物件模型。每個物件...

7 物件模型

標準 c 物件模型在執行時效率方面卓有成效,但是在某些特定問題域下的靜態特性就顯得捉襟見肘。gui 介面需要同時具有執行時的效率以及更高階別的靈活性。為了解決這一問題,qt 擴充套件 了標準 c 所謂 擴充套件 實際是在使用標準 c 編譯器編譯 qt 源程式之前,qt 先使用乙個叫做 moc met...