• <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>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            C++虛指針實(shí)現(xiàn)及效率

            轉(zhuǎn)載自:http://blog.chinaunix.net/space.php?uid=22257012&do=blog&id=2655107

            1. 單繼承虛函數(shù)例子

              class Point {
              public:
              virtual ~Point();

              virtual Point& mult( float ) = 0;
              //  other operations 

              float x() const return _x; }
              virtual float y() const return 0; }
              virtual float z() const return 0; }
              // 

              protected:
              Point( 
              float x = 0.0 );
              float _x;
              }
              ;
              class Point2d : public Point {
              public:
              Point2d( 
              float x = 0.0float y = 0.0 )
              : Point( x ), _y( y ) 
              {}
              ~Point2d();

              // overridden base class virtual functions
              Point2d& mult( float );
              float y() const return _y; }

              //  other operations 

              protected:
              float _y;
              }
              ;
              class Point3d: public Point2d {
              public:
              Point3d( 
              float x = 0.0,
              float y = 0.0float z = 0.0 )
              : Point2d( x, y ), _z( z ) 
              {}
              ~Point3d();

              // overridden base class virtual functions
              Point3d& mult( float );
              float z() const return _z; }

              //  other operations 
              protected:
              float _z;
              }
              ;

              1. VtableVPTR結(jié)構(gòu)

              虛函數(shù)的實(shí)現(xiàn)是通過VTablevptr。每一個(gè)帶有虛函數(shù)的都有一個(gè)VTable,在編譯器生成,每一個(gè)帶有虛函數(shù)的類實(shí)例都有一個(gè)vptr,該類實(shí)例vptr指向該類的VTable,在運(yùn)行期生成。


              如圖左部的類實(shí)例內(nèi)存結(jié)構(gòu),編譯器為之生成__vptr__Point的指針,指向該類的VTable

              VTable的結(jié)構(gòu)是一個(gè)函數(shù)指針數(shù)組,數(shù)組的每個(gè)元素是一個(gè)函數(shù)指針,指向該類虛函數(shù)的地址。因?yàn)榛?/font>PointPoint::mult()為純虛函數(shù),因此Point對應(yīng)的mult函數(shù)指針指向一個(gè)pure_virtual_called(),拋出調(diào)用純虛函數(shù)錯(cuò)誤。


              如圖VTable所示,Point類和其子類的析構(gòu)函數(shù)均在VTable[1]multVTable[2]yVTable[3]zVTable[4]。如果Point2d增加Point2d自己的虛函數(shù),同時(shí)Point3d繼承Point2d的虛函數(shù),他們相同的虛函數(shù)接口同樣對應(yīng)于相同的VTable數(shù)組下標(biāo),如VTable[5],此由編譯器保證,因而編譯器對于虛函數(shù)接口能將其轉(zhuǎn)換為函數(shù)指針數(shù)組的下標(biāo)。


              故,當(dāng)調(diào)用

              ptr->z();

              編譯器實(shí)際調(diào)用的是:

              ( *ptr->vptr[ 4 ] )( ptr );

              從而可以找到ptr實(shí)際指向的VTable中的虛函數(shù)調(diào)用地址。


              1. 虛函數(shù)系統(tǒng)開銷

              為了實(shí)現(xiàn)虛函數(shù),編譯器產(chǎn)生的操作包括:

                1. 編譯期,為每一個(gè)類增加一個(gè)VTable函數(shù)指針數(shù)組,并使其指向正確的虛函數(shù)實(shí)現(xiàn)。

                2. 運(yùn)行期,在類的構(gòu)造函數(shù)中,為每一個(gè)類實(shí)例增加一個(gè)vptr,指向該類的VTable

                3. 編譯器,將虛函數(shù)調(diào)用編譯為函數(shù)指針的調(diào)用。

                4. 運(yùn)行期,在虛函數(shù)調(diào)用時(shí),通過指向VTable和調(diào)用函數(shù)的index,查找函數(shù)指針(查找效率為數(shù)組隨機(jī)訪問,常數(shù)時(shí)間),調(diào)用虛函數(shù)。


              由分析得,虛函數(shù)開銷主要在編譯期的VTable函數(shù)指針數(shù)組的構(gòu)造,而運(yùn)行期的函數(shù)指針查找不是性能瓶頸。同時(shí),一個(gè)帶虛函數(shù)的基類無論有多少個(gè)孩子類,并不會降低虛函數(shù)性能,而如果類的繼承層次太深,底層類實(shí)例的構(gòu)造函數(shù)則需要為類繼承層次的每一層父類初始化vptr,效率降低。


              1. 虛函數(shù)系統(tǒng)性能測試

                void
                cross_product( 
                const pt3d &pA, const pt3d &pB )
                {
                pt3d pC;

                pC.x 
                = pA.y * pB.z - pA.z * pB.y;
                pC.y 
                = pA.z * pB.x - pA.x * pB.z;
                pC.z 
                = pA.x * pB.y - pA.y * pB.x;
                }

                main() 
                {
                pt3d pA( 
                1.7250.8750.478 );
                pt3d pB( 
                0.3150.3170.838 );

                for ( int iters = 0; iters < 10000000; iters++ )
                cross_product( pA, pB );

                return 0;
                }

              Optimized Non-optimized

              Inline Member 0.08 4.70

              Nonstatic Member 4.43 6.13

              Virtual Member

              CC 4.76 6.90

              NCC 4.63 7.72

              CCNCC是比較的兩個(gè)編譯器版本,對于上述計(jì)算函數(shù)的測試,虛函數(shù)的調(diào)用開銷主要是3.4虛表查詢,虛函數(shù)調(diào)用損失了4% 11%的運(yùn)行時(shí)間。相對于IO操作,可以忽略。


               

              1. 參考文獻(xiàn)

              Inside the C++ Object Model, By Stanley B. Lippman


            posted on 2011-10-24 16:00 楊粼波 閱讀(1356) 評論(0)  編輯 收藏 引用 所屬分類: C++

            国产成人久久精品二区三区| 精品久久久久久久久久中文字幕 | 色综合久久88色综合天天 | 日本精品久久久中文字幕 | 久久久久久亚洲精品成人| 97久久国产露脸精品国产| 久久精品国产久精国产思思| 99久久成人18免费网站| 久久久久久亚洲精品不卡| 亚洲人成网亚洲欧洲无码久久 | 亚洲欧美另类日本久久国产真实乱对白 | 国产香蕉久久精品综合网| 久久久久久夜精品精品免费啦| 99久久国产亚洲高清观看2024| 色狠狠久久综合网| 久久免费的精品国产V∧| 伊人久久免费视频| 久久精品一本到99热免费| 久久久久无码专区亚洲av| 99精品久久久久中文字幕| 国产精品久久新婚兰兰| 国内精品久久久久久久亚洲| 国内精品久久久久影院一蜜桃| 日韩电影久久久被窝网| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久精品亚洲欧美日韩久久| 亚洲国产精品高清久久久| 午夜福利91久久福利| 精品久久久久久久久久中文字幕| 久久综合亚洲欧美成人| 亚洲午夜久久久影院| 久久精品中文字幕大胸| 99热热久久这里只有精品68| 精品免费久久久久久久| 亚洲国产精品久久久天堂| 777午夜精品久久av蜜臀| 欧美亚洲国产精品久久| 香蕉久久夜色精品国产2020 | 久久成人18免费网站| 国产成人久久久精品二区三区| 国产∨亚洲V天堂无码久久久|