C++物件模型(1):對象記憶體布局簡介

來源:互聯網
上載者:User

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

 

假如有如下一個類

------------------------------------------------------------------------------------------------------------------------------

類聲明Arwen.h

class Arwen

{

public:

Arwen(void);

virtual ~Arwen(void);

 

int Age();

staticvoid
Height(int);

private:

  int m_nAge;

  staticint
s_nHeight;

};

----------------------------------------------------------------------------------------------------------------------------------

類源檔案Arwen.cpp

#include "Arwen.h"

int Arwen::s_nHeight = 1;  //記得初始化靜態變數

Arwen::Arwen(void){   }

Arwen::~Arwen(void){   }

 

int Arwen::Age ()

{

return m_nAge;

}

void Arwen::Height(int
a)

{

  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的結果可能不太一樣.

記憶體對齊詳見:http://baike.baidu.com/view/4786260.htm

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.