很多
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...