我們知道當例項化乙個類時,也就是產生乙個物件時需要分配記憶體空間.那乙個物件具體需要多少位元組的記憶體空間? 通過些什麼規則計算出來的?
假如有如下乙個類
類宣告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...