C 記憶體占用問題

2021-08-10 22:30:50 字數 2534 閱讀 1277

關於學習

完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...