關於學習
完c語言中
變數的記憶體管理和結構
體變數所佔記憶體大小的問題後
,到第二階段學
習c++面向對
象的程式設計
,大家肯定會有
這樣的疑問:
"在c++中乙個類對
象究竟占用多少記憶體?"
最近關於此
問題進行了相關資
料整理,感覺
這裡解釋的
應該很清楚,感
興趣的同學
請網下看:
很多c++
書籍中都介紹過,乙個
class
物件需要占用多大的記憶體空間?
最權威的結論是: *
非靜態成員變數總合。
(靜態為0)
*加上編譯器為了
cpu計算,作出的資料對齊處理。 *
加上為了支援虛函式,產生的額外負擔。
先寫乙個例子看看(注:以下所有結果都是在
vc6.0
開發環境中得出的結論)
一、空類的
size
classcar ;
voidmain()
輸出結果:
classcar size:1
這是為何呢?我想對於這個問題,不僅是剛入行不久的開發新手,就算有過幾年以上
c++開發經驗的開發人員也未必能說清楚這個。
編譯器在執行
car objcar;
這行**後需要,作出乙個
class car
的object
。並且這個
object
的位址還是獨一無二的,於是
編譯器就會給空類建立乙個隱含的乙個位元組的空間。
二、只有成員變數的
size
classcar ;
voidmain()
輸出結果:
classcar size:8
這個結果很多開發人員都清楚。在
32位系統中,整型變數佔
4個位元組。
這裡class car
中含有兩個整型型別的成員變數,所以
class size是8
。 classcar ;
voidmain()
輸出結果:
classcar size:8
我們這次在
class car
中新增了乙個靜態成員變數,但是
class size
仍然是8
個位元組。這正好符合了,結論中的第一條:
非靜態成員變數總合。
classcar ;
voidmain()
輸出結果:
classcar size:12
在類中又插入了乙個字元型變數,結果
class size
變成了12
。這個就是編譯器額外新增
3個字元變數,做資料對齊處理,
為了是提高
cpu的計算速度。編譯器額外新增的東西我們是無法看見的。這也符合了結論中的第二條:
加上編譯器為了
cpu計算,作出的資料對齊處理。
既然,我們這樣定義類成員資料編譯器會額外的增加空。那麼,我們何不在定義類的時候就考慮到資料對齊的問題,可以多定義出
3個字元型別變數作為預留變數,既能滿足資料對齊的要求,也給自己的程式新增了一些可擴充套件的空間。
三、只有成員函式的
size
classcar ;
~car(){};
public:
void fun(){}; };
voidmain()
輸出結果:
classcar size:1
噢,這是怎麼回事兒呢?再做乙個實驗看看。
classcar ;
~car(){};
public:
void fun(){};
private:
int nlength;
int nwidth; };
voidmain()
輸出結果:
classcar size:8
這次應該很清楚的了。
函式是不占用類空間的
。第乙個例子中的
size為1
個位元組,正是編譯器為類建立乙個隱含的乙個位元組的空間。
classcar ;
virtual ~car(){};
public:
void fun(){}; };
voidmain()
輸出結果:
classcar size:4
這次,讓析構函式為虛函式,看到了
class size為4
。這正是指向
virtual table
的指標vptr
的size
。這正好符合了,結論中的第三條:
加上為了支援虛函式,產生的額外負擔。
到此為止,乙個
class object
究竟占用多少記憶體空間,已經完全說清楚了。但是,這只是針對單獨類,或者說是基類適用。
C 占用記憶體的問題
我們不需要死讀硬記,我們需要用基本的知識來發展和增進每個學習者的思考力。列寧 用c 寫程式的時候,每每一開程式就占用20mb 的記憶體,寫個稍微複雜一點的wpf程式就佔到100 mb。相比之下,用mfc寫的程式占用的記憶體則相當少,20 mb的記憶體占用就比較多了。這點曾讓我相當頭疼,畢竟記憶體占用...
linux記憶體占用問題
linux開機後,使用top命令檢視,4g物理記憶體發現已使用的多大3.2g,佔用率高達80 以上 mem 3889836k total,3341868k used,547968k free,286044k buffers swap 6127608k total,0k used,6127608k f...
C 知識點 記憶體占用問題
有一次去面試,談的挺好的,被人問了乙個問題,瞬間暴露自己基礎能力弱的弱點了,這裡自己記錄下,以後慢慢長進。問題char test1 char test2 char test3 20 這三個語句使用 sizeof 輸出的結果是什麼,而我回答的,全部成了指標的長度了,悲劇啊 qdebug char te...