c++对象长度之空类(1)
在c++中說起對象,大家是不是很熟悉?
對象嘛,new一個不就行了嘛,對吧?(這里不說malloc,malloc它不負(fù)責(zé)觸發(fā)構(gòu)造函數(shù),它也不是運算符,沒法重載)
但當(dāng)我們提到對象大小的時候,大家對怎么計算呢?
是不是直接:
對象長度=sizeof(數(shù)據(jù)成員1)+sizeof(數(shù)據(jù)成員2)+sizeof(數(shù)據(jù)成員3)+sizeof(數(shù)據(jù)成員4)+…………sizeof(數(shù)據(jù)成員n)
是這樣對嘛?
那我們用這個公式驗證一下空對象的大小是不是應(yīng)該為0呢?對吧?那我們來驗證一下
從表面上看,這個公式是并沒有任何問題的,但對象的大小遠(yuǎn)遠(yuǎn)沒有那么簡單哦。即使類中繼承和虛函數(shù)的定義,仍有三種特殊情況能推翻此公式:
a.空類
b.內(nèi)存對齊
c.靜態(tài)數(shù)據(jù)成員
接下來請聽我詳細(xì)解釋:
空類
空類中沒有任何數(shù)據(jù)成員,按照該公式計算出的對象長度是0字節(jié)。類型長度為0,則此類的對象不占據(jù)內(nèi)存空間。而實際情況是,空類的長度為1字節(jié)。如果對象完全不占據(jù)內(nèi)存空間,那么空類就無法取得實例對象的地址,(每一個對象實例化都需要空間,這里系統(tǒng)默認(rèn)給了一個占位符,占1字節(jié)大小)this指針失效,因此就不能實例化。而類的定義是由成員數(shù)據(jù)和成員函數(shù)組成,在沒有成員數(shù)據(jù)的情況下,還可以有成員函數(shù),因此仍然需要實例化,分配了1字節(jié)的空間用于類的實例化,這1字節(jié)的數(shù)據(jù)并沒有被使用,當(dāng)然這只是針對于c++中的類和結(jié)構(gòu)體。
另外在c++中,一個空類和空結(jié)構(gòu)體是占一個字節(jié)的空間的。但在c語言中,空結(jié)構(gòu)體是不占空間的
總結(jié)
以上是生活随笔為你收集整理的c++对象长度之空类(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-12-12(c++多维数组的反
- 下一篇: c++对象长度之静态数据成员(3)