C++ 空基類優(yōu)化

1簡介:

空基類優(yōu)化,即當(dāng)存在空的基類子對(duì)象時(shí),可以將其默認(rèn)規(guī)定的占位字節(jié)忽略

2使用環(huán)境和注意點(diǎn):

(2.1)

空基類優(yōu)化是由于,對(duì)于一個(gè)空類對(duì)象而言,為了保證其地址的唯一性,所以其大小必大于等于1以保證占據(jù)相應(yīng)的地址,但是對(duì)于基類而言,特別是,對(duì)于C++中的standard layout(在這里)由于要保證標(biāo)準(zhǔn)導(dǎo)出,并且可以直接通過reinterpret_cast轉(zhuǎn)型為其第一個(gè)非靜態(tài)數(shù)據(jù)成員,又由于其特性,導(dǎo)致其基類必為不含非靜態(tài)數(shù)據(jù)成員(即為空),從而必須要求使用空基類優(yōu)化

(2.2)

優(yōu)化的條件即為,基類為空,且基類不存在vtp而且其派生類的第一個(gè)非靜態(tài)數(shù)據(jù)成員不為當(dāng)前繼承的空基類,那么就會(huì)發(fā)生優(yōu)化

(2.3)

注意,優(yōu)化僅發(fā)生在以上條件,在其他位置(非第一個(gè)非靜態(tài)成員),存在空基類數(shù)據(jù)成員時(shí),不發(fā)生優(yōu)化,遵循唯一地址和內(nèi)存對(duì)齊規(guī)定

(2.4)

在C++20起存在屬性no_unique_address即不使用地址位置,那么此時(shí)不管空類對(duì)象在那個(gè)位置,都將被優(yōu)化掉.


例子:

#include<iostream>
class Base{
    constexpr static int i = 4;
};
class C1:Base{
    int i = 0;
};
class C2{
    int i = 0;
    Base foo;
    //C++20 可以使用[[no-unique_address]]Base foo;    此時(shí),sizeof 就為4.
};
class C3:Base{
    Base foo;
    int i = 0;
};
int main(){
    using std::cout;
    cout<< sizeof(Base)<<" "<<sizeof(C1)<<" "<<sizeof(C2)<<" "<<sizeof(C3)<<std::endl;
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.C和C++的區(qū)別?C++的特性?面向?qū)ο缶幊痰暮锰帲?答:c++在c的基礎(chǔ)上增添類,C是一個(gè)結(jié)構(gòu)化語言,它的重...
    杰倫哎呦哎呦閱讀 10,005評(píng)論 0 45
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • “我的成功可以復(fù)制”這句話流行以來,到底有多少對(duì)此深信不疑,這我無法回答。我始終對(duì)這個(gè)句話保持懷疑,我始終每個(gè)人現(xiàn)...
    愛讀書的陜北大叔閱讀 1,418評(píng)論 1 15
  • 這兩天我也是開始為期四天的養(yǎng)生專業(yè)魔鬼訓(xùn)練,今晚又是一個(gè)十二點(diǎn),感覺比上學(xué)時(shí)候還葩道。早睡迎接明天的垗戰(zhàn)
    尚源希媽媽閱讀 131評(píng)論 0 0

友情鏈接更多精彩內(nèi)容