在C 中乙個類物件究竟占用多少記憶體

2021-09-30 04:32:09 字數 2609 閱讀 4260

很多

c++書籍中都介紹過,乙個

class

物件需要占用多大的記憶體空間。最權威的結論是:

*

非靜態成員變數總合。

*

加上編譯器為了cpu

計算,作出的資料對齊處理。

*

加上為了支援虛函式,產生的額外負擔。

介紹完了理論知識後,再看看再找乙個例子看看(注:一下所有結果都是在

vc6.0

開發環境中得出的結論)

一、空類的size

class car

{};void main()

輸出結果:

class car size:1

這是為何呢?我想對於這個問題,不僅是剛入行不久的開發新手,就算有過幾年以上

c++開發經驗的開發人員也未必能說清楚這個。

編譯器在執行

car objcar;

這行**後需要,作出乙個

class car

的object

。並且這個

object

的位址還是獨一無二的,於是編譯器就會給空類建立乙個隱含的乙個位元組的空間。

二、只有成員變數的size

class car ;

void main()

輸出結果:

class car size:8

這個結果很多開發人員都清楚。在

32位系統中,整型變數佔

4個位元組。這裡

class car

中含有兩個整型型別的成員變數,所以

class size是8

。class car ;

void main()

輸出結果:

class car size:8

我們這次在

class car

中新增了乙個靜態成員變數,但是

class size

仍然是8

個位元組。這正好符合了,結論中的第一條:非靜態成員變數總合。因為靜態變數存放在全域性

/靜態區,非靜態變數存放在堆上

class car ;

void main()

輸出結果:

class car size:12

在類中又插入了乙個字元型變數,結果

class size

變成了12

。這個就是編譯器額外新增

3個字元變數,做資料對齊處理,為了是提高

cpu的計算速度。編譯器額外新增的東西我們是無法看見的。這也符合了結論中的第二條:加上編譯器為了

cpu計算,作出的資料對齊處理。

既然,我們這樣定義類成員資料編譯器會額外的增加空。那麼,我們何不在定義類的時候就考慮到資料對齊的問題,可以多定義出

3個字元型別變數作為預留變數,既能滿足資料對齊的要求,也給自己的程式新增了一些可擴充套件的空間。

三、只有成員函式的size

class car ;

~car(){};

public:

void fun(){}; };

void main()

輸出結果:

class car size:1

噢,這是怎麼回事兒呢?再做乙個實驗看看。

class car ;

~car(){};

public:

void fun(){};

private:

int nlength;

int nwidth; };

void main()

輸出結果:

class car size:8

這次應該很清楚的了。函式是不占用類空間的。第乙個例子中的

size為1

個位元組,正是編譯器為類建立乙個隱含的乙個位元組的空間

class car ;

virtual ~car(){};

public:

void fun(){}; };

void main()

輸出結果:

class car size:4

這次,讓析構函式為虛函式,看到了

class size為4

。這正是指向

virtual table

的指標vptr

的size

。這正好符合了,結論中的第三條:加上為了支援虛函式,產生的額外負擔。

到此為止,乙個

class object

究竟占用多少記憶體空間,已經完全說清楚了。但是,這只是針對單獨類,或者說是基類適用。對於子類,卻不一樣了。有興趣的朋友可以做一些實驗。

**:

C 中乙個class類物件占用多少內位元組

乙個空的class在記憶體中多少位元組?如果加入乙個成員函式後是多大?這個成員函式儲存在記憶體中什麼部分?乙個class物件需要占用多大的記憶體空間。最權威的結論是 非靜態成員變數總合。加上編譯器為了cpu計算,作出的資料對齊處理。加上為了支援虛函式,產生的額外負擔。介紹完了理論知識後,再看看再找乙...

C 中乙個class類物件占用多少內位元組

原文 乙個空的class在記憶體中多少位元組?如果加入乙個成員函式後是多大?這個成員函式儲存在記憶體中什麼部分?乙個class物件需要占用多大的記憶體空間。最權威的結論是 非靜態成員變數總合。加上編譯器為了cpu計算,作出的資料對齊處理。加上為了支援虛函式,產生的額外負擔。介紹完了理論知識後,再看看...

C 中乙個函式接收乙個類物件時使用引用會怎樣

今天看 時,遇到乙個問題 include using namespace std class point virtual double area const private double x,y double point area const class rectangle public point...