青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 28, comments - 179, trackbacks - 0, articles - 1
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

什么是EBC和EBO

Posted on 2007-06-04 11:34 chemz 閱讀(2143) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C++
                                 什么是EBC和EBO
    EBC英文全稱為“Empty Base Class”,中文全稱“空基類”。那什么是空基類呢?簡(jiǎn)單的
說(shuō)就是沒(méi)有任何數(shù)據(jù)成員的類就稱之為空基類。也就是EBC的類定義中不包含任何數(shù)據(jù)成員,
那么這樣一來(lái)可能大家會(huì)認(rèn)為一個(gè)EBC的尺寸(sizeof)因該是0,確實(shí)按照定義而言因該是
這樣的,但是我們知道即使是一個(gè)EBC也可以定義一個(gè)對(duì)象,而對(duì)象是一個(gè)運(yùn)行時(shí)的內(nèi)存實(shí)
體,也就是說(shuō)對(duì)象是必須要能夠通過(guò)內(nèi)存地址進(jìn)行區(qū)分的,那么即使是一個(gè)EBC類的對(duì)象也
必須占有內(nèi)存空間,這樣一來(lái)一般情況下編譯器會(huì)將EBC的尺寸看作1字節(jié),也就是讓其對(duì)象
占用一個(gè)字節(jié)的空間,這樣一來(lái)既可以達(dá)到對(duì)象的地址鑒別,同時(shí)也是一個(gè)比較節(jié)約內(nèi)存的
分配策略。例如:
        #include <cassert>
        
        struct CEmptyClass {};
        int main( int argc, char *argv[] )
        {
            CEmptyClass emptyObject;
            assert( sizeof( CEmptyClass ) == 1 );
            assert( sizeof( emptyObject ) == 1 );
           
            return 0;
        }
    通過(guò)上面的討論已經(jīng)知道什么是空基類了,那么下面這些的類屬于空基類么?
        struct CEmptyClass1 { CEmptyClass1() {}; ~CEmptyClass1() {} };
        struct CEmptyClass2 { void print() {} };
        struct CEmptyClass3 { virtual ~CEmptyClass3() {} };
        struct CEmptyClass4 : public CEmptyClass1 {};
        struct CEmptyClass5 : public CEmptyClass3 {};
        struct CEmptyClass6 { uint32_t v; };
        struct CEmptyClass7 : public CEmptyClass6 {};
       
        struct CEmptyClass10 : virtual public CEmptyClass1 {};
        struct CEmptyClass11 : virtual public CEmptyClass1 {};
        struct CEmptyClass12 : public CEmptyClass10, public CEmptyClass11 {};
       
    根據(jù)上面的定義“沒(méi)有任何數(shù)據(jù)成員”,這里的數(shù)據(jù)成員不僅僅包括類的成員變量,同
時(shí)還包括編譯器為了某種目的引入的數(shù)據(jù)成員,比如:為了支持多態(tài)而引入的虛指針vptr、
為了支持虛繼承而引入的必要的虛基類指針等,而且還包括從基類繼承直接或間接繼承而
來(lái)的上述的數(shù)據(jù)成員。那么這樣一來(lái),上面的問(wèn)題就很清楚了,CEmptyClass3、
CEmptyClass5、CEmptyClass6、CEmptyClass7、CEmptyClass10、CEmptyClass11、
CEmptyClass12就不是EBC了,而CEmptyClass1、CEmptyClass2、CEmptyClass4仍然是EBC。
    那么可能有些人會(huì)看出來(lái)如果這樣的一個(gè)類,他的尺寸是多少呢?
        struct CEmptyClass20 : public CEmptyClass1, public CEmptyClass2 {};
        struct CEmptyClass21 : public CEmptyClass1 { uint32_t v; };
        struct CEmptyClass22 : public CEmptyClass1, public CEmptyClass2 { uint32_t v; };
        struct CEmptyClass23 : public CEmptyClass1, public CEmptyClass6 {};
    在VC++8和g++3.4.x(g++4以上版本編譯上述代碼出現(xiàn)編譯錯(cuò)誤)版本時(shí)所出現(xiàn)的結(jié)果
會(huì)比較出人意料:
        sizeof( CEmptyClass20 ) == 1
        sizeof( CEmptyClass21 ) == 4
        sizeof( CEmptyClass22 ) == 8
        sizeof( CEmptyClass23 ) == 4
    為什么會(huì)出現(xiàn)上述的結(jié)果呢?這個(gè)主要是因?yàn)榫幾g器實(shí)施EBO所致的。那什么是EBO呢?
EBO英文全稱“Empty Base Class Optimize”,中文全稱“空基類優(yōu)化”。其實(shí)就是在EBC類被
繼承的是時(shí)候由于空基類沒(méi)有任何數(shù)據(jù)成員所以可以讓其在子類的對(duì)象布局中優(yōu)化掉EBC所
占用的那一個(gè)字節(jié),用子類對(duì)象的首地址作為EBC的子對(duì)象的首地址(也就是this指針)。
需要注意的是并不是每一次EBO優(yōu)化都回被成功的實(shí)施,有時(shí)候由于繼承關(guān)系和對(duì)象布局
問(wèn)題會(huì)導(dǎo)致無(wú)法實(shí)施EBO優(yōu)化,從而導(dǎo)致EBC的子對(duì)象必然會(huì)在子類的對(duì)象中占用一定的空
間(一般會(huì)大于1個(gè)字節(jié),主要是因?yàn)閮?nèi)存對(duì)齊的需要)。
    我們來(lái)分析上面的的4個(gè)繼承類的尺寸現(xiàn)象問(wèn)題:
    1. sizeof( CEmptyClass20 ) == 1;CEmptyClass20類繼承于兩個(gè)EBC類,同時(shí)自己也
       是一個(gè)EBC類,所以編譯器會(huì)自動(dòng)地優(yōu)化掉兩個(gè)基類的子對(duì)象的內(nèi)存空間,所以尺寸
       仍然是1字節(jié);
    2. sizeof( CEmptyClass21 ) == 4;CEmptyClass21類繼承于一個(gè)EBC類,同時(shí)自己也
       包含一個(gè)4字節(jié)的成員變量,此時(shí)可以成功的實(shí)施EBO優(yōu)化將EBC的內(nèi)存空間優(yōu)化掉;
    3. sizeof( CEmptyClass22 ) == 8;CEmptyClass22類繼承于兩個(gè)EBC類,同時(shí)自己也
       包含一個(gè)4字節(jié)的成員變量,按一般常理而言此時(shí)編譯器應(yīng)該可以優(yōu)化掉兩個(gè)EBC所
       需要的內(nèi)存空間,從而使得其尺寸僅僅只有4個(gè)字節(jié),可是為什么會(huì)有8個(gè)字節(jié)呢?
       也就是說(shuō)此時(shí)編譯器并沒(méi)有實(shí)施EBO優(yōu)化,使得每一個(gè)EBC子對(duì)象都回占用1個(gè)字節(jié)的
       內(nèi)存,從而占用2字節(jié)內(nèi)存,再加上32位系統(tǒng)下的對(duì)齊需要填充2個(gè)字節(jié)已形成4字節(jié)
       對(duì)齊,所以會(huì)導(dǎo)致其成為8個(gè)字節(jié);
    4. sizeof( CEmptyClass23 ) == 4;CEmptyClass23類繼承于一個(gè)EBC類和一個(gè)非EBC類,
       而CEmptyClass6因?yàn)楹幸粋€(gè)vptr所以具有4字節(jié)尺寸,而CEmtpyClass23內(nèi)本身不
       包含任何數(shù)據(jù)成員,通過(guò)EBO優(yōu)化掉第一個(gè)EBC的內(nèi)存,所以其尺寸就是4字節(jié)。
    通過(guò)上面的分析可以看出來(lái),一般情況下如果子類的基類列表中只有一個(gè)EBC時(shí)時(shí)一定
可以成功實(shí)施EBO優(yōu)化的,而如果出現(xiàn)多繼承于多個(gè)EBC時(shí)會(huì)根據(jù)子類是否包含數(shù)據(jù)成員而
確定能夠?qū)嵤〦BO優(yōu)化,同時(shí)會(huì)和編譯器的優(yōu)化策略具有較大的關(guān)系。
    在boost庫(kù)中有非常多的機(jī)制依賴于EBO優(yōu)化,比如:nocopyable等,充分的理解EBC/EBO
并利用其所具有的內(nèi)存優(yōu)化特征,會(huì)在類繼承體系中引入行為/策略的同時(shí)不導(dǎo)致對(duì)象的膨脹。
 

Feedback

# re: 什么是EBC和EBO  回復(fù)  更多評(píng)論   

2007-06-04 13:50 by picasa
空基類和虛基類很相似

# re: 什么是EBC和EBO[未登錄](méi)  回復(fù)  更多評(píng)論   

2007-06-04 14:02 by chemz
虛基類是虛擬繼承下的基類,抽象基類ABC(Abstruct Base Class)是包含有純虛函數(shù)的基類。虛基類在繼承時(shí)會(huì)在其子類中加入虛基類偏移指針,而ABC會(huì)由于具有虛函數(shù)而類中包含了vptr。

# re: 什么是EBC和EBO[未登錄](méi)  回復(fù)  更多評(píng)論   

2007-06-04 20:17 by 夢(mèng)在天涯
不錯(cuò)!

# re: 什么是EBC和EBO  回復(fù)  更多評(píng)論   

2007-06-05 17:44 by walkspeed
空基類在設(shè)計(jì)中是很有用的,特別是在范型下面,那可是個(gè)好東東亞。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精选大片| 免费不卡在线视频| 欧美高清一区二区| 另类国产ts人妖高潮视频| 久久久999精品| 美乳少妇欧美精品| 亚洲欧洲一区二区三区久久| 亚洲成色www久久网站| 亚洲激情成人在线| 宅男噜噜噜66一区二区66| 亚洲欧美在线一区| 久久香蕉精品| 欧美日韩一区二区三区在线看| 国产精品麻豆va在线播放| 国产字幕视频一区二区| 日韩系列在线| 久久精品中文| 亚洲精品影视在线观看| 亚洲欧美另类综合偷拍| 欧美黄色精品| 国产一区在线视频| 亚洲综合色自拍一区| 久久一日本道色综合久久| 亚洲精品久久| 久久久www| 欧美系列亚洲系列| 亚洲第一页在线| 亚洲欧美日韩精品久久久久| 美女视频黄 久久| 99re亚洲国产精品| 另类酷文…触手系列精品集v1小说| 欧美激情综合色| 国产一区二区看久久| 一本色道久久综合狠狠躁篇怎么玩| 午夜亚洲精品| 亚洲精品久久久久久下一站 | 久久夜色精品一区| 国产资源精品在线观看| 亚洲精品麻豆| 亚洲国产婷婷香蕉久久久久久99| 一区二区三区欧美| 欧美a级一区| 国产日本欧美在线观看 | 午夜精品婷婷| 欧美日韩精品免费观看| 一区二区亚洲| 欧美一级夜夜爽| 亚洲精品黄色| 欧美大胆a视频| 在线观看视频亚洲| 久久成人精品电影| 亚洲一区日韩| 国产精品成人免费视频| 999在线观看精品免费不卡网站| 久久久久成人精品免费播放动漫| 在线午夜精品| 欧美日韩视频免费播放| 亚洲精品一区二区三区樱花| 免费在线成人av| 久久嫩草精品久久久精品一| 国产亚洲高清视频| 久久久水蜜桃av免费网站| 午夜久久黄色| 激情婷婷欧美| 欧美jizz19性欧美| 麻豆精品网站| 亚洲精品欧洲| 亚洲精品综合久久中文字幕| 欧美国产日韩一区二区三区| 亚洲国产导航| 亚洲精品欧美极品| 欧美性感一类影片在线播放| 亚洲自啪免费| 亚洲综合国产激情另类一区| 国产精品一区二区三区乱码| 久久精品99无色码中文字幕| 久久国产高清| 在线精品视频免费观看 | 亚洲欧美成人综合| 国产精品网站在线| 久久九九全国免费精品观看| 久久九九热免费视频| 亚洲国产日韩欧美综合久久| 亚洲国产精品电影| 欧美日韩午夜精品| 欧美在线视频观看| 久久精品一区二区三区不卡牛牛| 亚洲国产精品第一区二区三区| 最新精品在线| 国产伦精品一区二区三区免费迷| 久久亚洲国产成人| 欧美激情第3页| 欧美一级片在线播放| 香蕉av福利精品导航| 久久国产精品久久国产精品| 亚洲激情在线播放| 一区二区三区**美女毛片| 国产综合久久久久久鬼色| 亚洲高清久久网| 国产精品视频第一区| 欧美成人国产va精品日本一级| 欧美色123| 免费在线视频一区| 国产精品a久久久久| 欧美顶级大胆免费视频| 欧美日韩午夜精品| 六月婷婷一区| 国产精品一区二区三区久久久| 欧美激情片在线观看| 国产欧美日本一区二区三区| 亚洲经典在线看| 国产一区二区三区在线观看网站| 亚洲片在线资源| 在线精品国产欧美| 欧美一区二区成人6969| 亚洲一区二区视频在线| 久久一区免费| 久久男人资源视频| 国产精品久99| 亚洲日本欧美日韩高观看| 在线观看成人网| 性色av一区二区三区红粉影视| 艳妇臀荡乳欲伦亚洲一区| 国产一区二区三区在线观看网站| 午夜精品短视频| 欧美金8天国| 久久夜色精品国产亚洲aⅴ| 国产精品乱人伦中文| 亚洲国产精品悠悠久久琪琪| 国产专区一区| 亚洲一区中文| 亚洲尤物视频网| 欧美精品久久久久a| 欧美成人精品激情在线观看| 国产日韩欧美一区| 亚洲欧美日韩精品久久久久| 亚洲免费网址| 国产精品爱啪在线线免费观看| 亚洲日本电影| 亚洲一区二区三区四区五区黄| 欧美日韩另类国产亚洲欧美一级| 亚洲高清不卡| 亚洲毛片网站| 欧美片第1页综合| 国产乱码精品1区2区3区| 国产精品入口麻豆原神| 国产亚洲欧美日韩美女| 欧美午夜精品久久久久久人妖| 亚洲人线精品午夜| 久久九九热re6这里有精品| 性欧美1819性猛交| 国产精品嫩草99av在线| 亚洲在线不卡| 久久亚洲视频| 尤妮丝一区二区裸体视频| 久久久精品视频成人| 国产亚洲成av人在线观看导航| 亚洲欧美清纯在线制服| 久久成人人人人精品欧| 国语自产精品视频在线看| 久久综合久久综合久久| 亚洲欧洲日产国产综合网| 亚洲中字在线| 一区二区在线视频| 日韩小视频在线观看| 欧美一二三视频| 国产欧美日韩亚洲| 久久精品一二三区| 亚洲国产欧美一区二区三区同亚洲 | 欧美一级欧美一级在线播放| 国产一区激情| 欧美大片18| 亚洲一区日韩| 欧美成人性生活| 亚洲一级黄色片| 国产综合色精品一区二区三区| 免费黄网站欧美| 亚洲一区二区三区777| 欧美高清在线一区| 欧美呦呦网站| 亚洲免费观看| 国产在线观看一区| 欧美日韩三区四区| 久久夜色精品国产欧美乱| 中文国产一区| 亚洲大胆女人| 国产久一道中文一区| 亚洲美女尤物影院| 久久久久久久久综合| 一区二区三区福利| 一区视频在线| 国产欧美欧美| 国产精品久久久久久久久久直播| 久久夜色精品一区| 亚洲欧美激情一区| 一区二区91| 亚洲日本激情| 欧美激情影院| 嫩草影视亚洲| 久久人人爽人人爽爽久久|