C++中一個class類對象佔用多少內位元組(7個例子,很清楚)

來源:互聯網
上載者:User

標籤:變數   font   printf   logs   計算   代碼   char   virtual   32位   

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

 

    一個Class對象需要佔用多大的記憶體空間。最權威的結論是: 
*非靜態成員變數總合。 
*加上編譯器為了CPU計算,作出的資料對齊處理。 
*加上為了支援虛函數,產生的額外負擔。

介紹完了理論知識後,再看看再找一個例子看看(註:一下所有結果都是在VC6.0 開發環境中得出的結論) 


    一、空類的Size

 1 class Car 2 { 3 }; 4   5 void main() 6 { 7     int size = 0; 8     Car objCar; 9     size = sizeof(objCar);10     printf("%s %d /r", "Class Car Size:", size);11 }
輸出結果:Class Car Size:1

這是為何呢?我想對於這個問題,不僅是剛入行不久的開發新手,就算有過幾年以上C++開發經驗的開發人員也未必能說清楚這個。 
編譯器在執行Car objCar;這行代碼後需要,作出一個Class Car的Object。並且這個Object的地址還是獨一無二的,於是編譯器就會給空類建立一個隱含的一個位元組的空間。

 

    二、只有成員變數的Size

 1 class Car 2 { 3 private: 4     int nLength; 5     int nWidth; 6 }; 7   8 void main() 9 {10     int size = 0;11     Car objCar;12     size = sizeof(objCar);13     printf("%s %d /r", "Class Car Size:", size);14 }
輸出結果:Class Car Size:8

這個結果很多開發人員都清楚。在32位系統中,整型變數佔4個位元組。這裡Class Car中含有兩個整數型別的成員變數,所以Class Size是8。

 

    三、有靜態成員變數的Size

 1 class Car 2 { 3 private: 4     int nLength; 5     int nWidth; 6     static int sHigh; 7 }; 8   9 void main()10 {11     int size = 0;12     Car objCar;13     size = sizeof(objCar);14     printf("%s %d /r", "Class Car Size:", size);15 }
輸出結果:Class Car Size:8

我們這次在Class Car中添加了一個靜態成員變數,但是Class Size仍然是8個位元組。這正好符合了,結論中的第一條:非靜態成員變數總合。

 

    四、有字元型變數(char)的Size

 1 class Car 2 { 3 private: 4     char chLogo 5     int nLength; 6     int nWidth; 7     static int sHigh; 8 }; 9  10 void main()11 {12     int size = 0;13     Car objCar;14     size = sizeof(objCar);15     printf("%s %d /r", "Class Car Size:", size);16 }
輸出結果:Class Car Size:12

在類中又插入了一個字元型變數,結果Class Size變成了12。這個就是編譯器額外添加3個字元變數,做資料對齊處理,為了是提高CPU的計算速度。編譯器額外添加的東西我們是無法看見的。這也符合了結論中的第二條:加上編譯器為了CPU計算,作出的資料對齊處理。 
既然,我們這樣定義類成員資料編譯器會額外的增加空。那麼,我們何不在定義類的時候就考慮到資料對齊的問題,可以多定義出3個字元類型變數作為預留變數,既能滿足資料對齊的要求,也給自己的程式添加了一些可擴充的空間。

 

    五、只有成員函數的Size

 1 class Car 2 { 3 public: 4     Car(){}; 5     ~Car(){}; 6 public: 7     void Fun(){}; 8 }; 9  10 void main()11 {12     int size = 0;13     Car objCar;14     size = sizeof(objCar);15     printf("%s %d /r", "Class Car Size:", size);16 }
輸出結果:Class Car Size:1

噢,這是怎麼回事兒呢?再做一個實驗看看。

 

    六、有成員函數和成員變數的Size

 1 class Car 2 { 3 public: 4     Car(){}; 5     ~Car(){}; 6 public: 7     void Fun(){}; 8 private: 9     int nLength;10     int nWidth;11 };12  13 void main()14 {15     int size = 0;16     Car objCar;17     size = sizeof(objCar);18     printf("%s %d /r", "Class Car Size:", size);19 }
輸出結果:Class Car Size:8

這次應該很清楚的了。函數是不佔用類空間的。第一個例子中的Size為1個位元組,正是編譯器為類建立一個隱含的一個位元組的空間

 

    七、有虛函數(virtual)的Size

 1 class Car 2 { 3 public: 4     Car(){}; 5     virtual ~Car(){}; 6 public: 7     void Fun(){}; 8 }; 9  10 void main()11 {12     int size = 0;13     Car objCar;14     size = sizeof(objCar);15     printf("%s %d /r", "Class Car Size:", size);16 }
輸出結果:Class Car Size:4

這次,讓解構函式為虛函數,看到了Class Size為4。這正是指向Virtual Table的指標vptr的Size。這正好符合了,結論中的第三條:加上為了支援虛函數,產生的額外負擔。

 

http://www.cnblogs.com/findumars/p/7270628.html

C++中一個class類對象佔用多少內位元組(7個例子,很清楚)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.