C 中空類佔一位元組原因詳解

2021-07-31 10:41:18 字數 1349 閱讀 8337

c++中空類佔位問題

在c++中空類會佔乙個位元組,這是為了讓物件的例項能夠相互區別。具體來說,空類同樣可以被例項化,並且每個例項在記憶體中都有獨一無二的位址,因此,編譯器會給空類隱含加上乙個位元組,這樣空類例項化之後就會擁有獨一無二的記憶體位址。如果沒有這乙個位元組的佔位,那麼空類就無所謂例項化了,因為例項化的過程就是在記憶體中分配一塊位址。

注意:當該空白類作為基類時,該類的大小就優化為0了,這就是所謂的空白基類最優化。

如上圖所示,這個佔位位元組僅僅是用來佔位。

空白基類最優化:

在上例中,大部分編譯器對於sizeof(derive)的結果是4,而不是8。這就是所謂的空白基類最優化在(empty base optimization-ebo 或 empty base classopimization-ebco)。在空基類被繼承後由於沒有任何資料成員,所以子類優化掉基類所佔的1 byte。ebo並不是c++標準所規定必須的,但是大部分編譯器都會這麼做。由於空基類優化技術節省了物件不必要的空間,提高了執行效率,因此成為某些強大技術的基石,基於型別定義類如stl中的binary_function、unary_function、iterator、iterator_traits的實現復用;基於策略類如記憶體管理、多執行緒安全同步的實現復用。當某個類存在空類型別的資料成員時,也可考慮借助ebo優化物件布局.

注意:空白基類最優化無法被施加於多重繼承上只適合單一繼承。

多繼承:

C 中空類佔一位元組原因詳解

c 中空類佔一位元組原因詳解 xsh的部落格 csdn部落格 在c 中空類會佔乙個位元組,這是為了讓物件的例項能夠相互區別。具體來說,空類同樣可以被例項化,並且每個例項在記憶體中都有獨一無二的位址,因此,編譯器會給空類隱含加上乙個位元組,這樣空類例項化之後就會擁有獨一無二的記憶體位址。如果沒有這乙個...

Daticist (一)位元組跳動資料分析筆試

因為自己準備的時候戰戰兢兢,所以希望給學弟學妹一些經驗,希望大家都萬事勝意o 不知道這算不算侵位元組爸爸的權啊,是的話麻煩提醒一下,我就刪了 1 負責分位元組跳動旗下國內外產品及業務的資料分析工作 2 分析各項影響產品提公升與增長的因素 各項業務細節,結合業務方向,給出可落地的整體的產品優化方案 3...

stm32 串列埠傳送資料第一位元組丟失

使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04.接收端收到的資料為 0x02 0x03 0x04,第乙個資料丟失。查閱stm32f10x參考手冊,找到這樣一句話 tc 傳送完成 當包含有資料的一幀傳送完成後,由硬體將該...