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

2021-06-19 02:40:55 字數 1964 閱讀 1141

乙個空的class在記憶體中多少位元組?如果加入乙個成員函式後是多大?這個成員函式儲存在記憶體中什麼部分?

乙個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。這正好符合了,結論中的第三條:加上為了支援虛函式,產生的額外負擔。

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

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

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

很多 c 書籍中都介紹過,乙個 class 物件需要占用多大的記憶體空間。最權威的結論是 非靜態成員變數總合。加上編譯器為了cpu 計算,作出的資料對齊處理。加上為了支援虛函式,產生的額外負擔。介紹完了理論知識後,再看看再找乙個例子看看 注 一下所有結果都是在 vc6.0 開發環境中得出的結論 一 ...

得到乙個類的class物件

1.class的forname 方法的返回值就是class型別 2.class 類名 clazz 類名.class,例子 classclazz student.class 3.object 類中有乙個名為getclass的成員方法,返回的是物件執行時類的class物件。student stu new...