你真的知道C++對象大小嗎?
我們都直到char大小為1,int為4,那么C++中對象的大小是多少呢?
看三個問題:
- C++中函數(shù)占不占對象的大小
- 空類的大小是多少?
- 如果類中有虛函數(shù),類的大小是多少?
一,C++中函數(shù)占不占對象的大小
看一段代碼:
可以看出,類的大小即為類的屬性a的大小為4,函數(shù)并不占對象的大小。
那么這個的原因是什么呢?
原因:
這樣定義的好處就是為了節(jié)省空間的大小。
假設(shè)此時類中有10個函數(shù),類又定義了100個對象。如果每個對象都包含一個函數(shù)的大小,那么就需要占用1000個函數(shù)空間的位置,這樣極大的消耗了資源。
實際上類的函數(shù)是放在代碼區(qū)的,哪個對象需要調(diào)用函數(shù),則從代碼區(qū)調(diào)用,因為函數(shù)并不是對象獨有屬性,所以并不沖突,這樣僅僅占10個函數(shù)空間位置就夠了。
這樣一對比,函數(shù)放在代碼區(qū)節(jié)省了很多的資源,因此函數(shù)并不占用對象的大小。
至于對象放的位置,如果new的就在堆區(qū),不然就在棧區(qū)。
二,空類的大小是多少?
看代碼:
我們會發(fā)現(xiàn),空類的大小變成了1,正常不應該是0嗎?
這樣設(shè)置的原因是因為每一個對象實例化都需要空間,這里系統(tǒng)默認給了一個占位符,占1字節(jié)大小
三,如果類中有虛函數(shù),類的大小是多少?
看圖片:
對比上面兩種情況,空類大小為1,但是函數(shù)又不占用空間,為什么函數(shù)變?yōu)樘摵瘮?shù)卻變成了4呢?
因為當有虛函數(shù)時,編譯器會給這個類加上虛函數(shù)指針 vptr(32位是4,64位是8)
此時類中有了指針,因此對象的大小就變?yōu)榱?。
上面就是類中不同情況的大小。
總結(jié)
到此這篇關(guān)于你真的知道C++對象大小的文章就介紹到這了,更多相關(guān)C++對象大小內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較
以下是對字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進行了比較,需要的朋友可以過來參考下2013-07-07