你真的知道C++對(duì)象大小嗎?
我們都直到char大小為1,int為4,那么C++中對(duì)象的大小是多少呢?
看三個(gè)問題:
- C++中函數(shù)占不占對(duì)象的大小
- 空類的大小是多少?
- 如果類中有虛函數(shù),類的大小是多少?
一,C++中函數(shù)占不占對(duì)象的大小
看一段代碼:
可以看出,類的大小即為類的屬性a的大小為4,函數(shù)并不占對(duì)象的大小。
那么這個(gè)的原因是什么呢?
原因:
這樣定義的好處就是為了節(jié)省空間的大小。
假設(shè)此時(shí)類中有10個(gè)函數(shù),類又定義了100個(gè)對(duì)象。如果每個(gè)對(duì)象都包含一個(gè)函數(shù)的大小,那么就需要占用1000個(gè)函數(shù)空間的位置,這樣極大的消耗了資源。
實(shí)際上類的函數(shù)是放在代碼區(qū)的,哪個(gè)對(duì)象需要調(diào)用函數(shù),則從代碼區(qū)調(diào)用,因?yàn)楹瘮?shù)并不是對(duì)象獨(dú)有屬性,所以并不沖突,這樣僅僅占10個(gè)函數(shù)空間位置就夠了。
這樣一對(duì)比,函數(shù)放在代碼區(qū)節(jié)省了很多的資源,因此函數(shù)并不占用對(duì)象的大小。
至于對(duì)象放的位置,如果new的就在堆區(qū),不然就在棧區(qū)。
二,空類的大小是多少?
看代碼:
我們會(huì)發(fā)現(xiàn),空類的大小變成了1,正常不應(yīng)該是0嗎?
這樣設(shè)置的原因是因?yàn)槊恳粋€(gè)對(duì)象實(shí)例化都需要空間,這里系統(tǒng)默認(rèn)給了一個(gè)占位符,占1字節(jié)大小
三,如果類中有虛函數(shù),類的大小是多少?
看圖片:
對(duì)比上面兩種情況,空類大小為1,但是函數(shù)又不占用空間,為什么函數(shù)變?yōu)樘摵瘮?shù)卻變成了4呢?
因?yàn)楫?dāng)有虛函數(shù)時(shí),編譯器會(huì)給這個(gè)類加上虛函數(shù)指針 vptr(32位是4,64位是8)
此時(shí)類中有了指針,因此對(duì)象的大小就變?yōu)榱?。
上面就是類中不同情況的大小。
總結(jié)
到此這篇關(guān)于你真的知道C++對(duì)象大小的文章就介紹到這了,更多相關(guān)C++對(duì)象大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中的函數(shù)指針基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了C語言中的函數(shù)指針基礎(chǔ)學(xué)習(xí)教程,包括函數(shù)指針作為參數(shù)來傳遞等重要知識(shí),需要的朋友可以參考下2016-04-04Qt實(shí)現(xiàn)繪制一個(gè)簡單多邊形的示例代碼
QT提供了圖形繪制接口QPainter,通過該接口可以繪制多種圖形,包括多邊形。本文就來利用它實(shí)現(xiàn)繪制一個(gè)簡單的多邊形,感興趣的可以嘗試一下2022-11-11QT使用canon sdk拍照并保存到本機(jī)的方法示例
這篇文章主要介紹了QT使用canon sdk拍照并保存到本機(jī)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較
以下是對(duì)字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進(jìn)行了比較,需要的朋友可以過來參考下2013-07-07