原文
乙個空的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這次,讓析構函式為虛函式,看到了class size為4。這正是指向virtual table的指標vptr的size。這正好符合了,結論中的第三條:加上為了支援虛函式,產生的額外負擔。; virtual ~car(){};
public:
void fun(){};};
void main()
輸出結果:class car size:4
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...