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

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            C++構造函數的幕后工作

            多年前學習C++的時候就知道每個類都有一個默認的構造函數,但是為什么要有這樣的規則卻一直不求甚解,汗一個。剛好最近在重新學習C++的內存模型,看看它到底做了么事?

            寫一個簡單的類:

            class CParentA

            {

            public:

               CParentA() {}

             

            public:

               int parenta_a;

               int parenta_b;

             

            public:  

               virtual void parenta_f1() {this->parenta_a = 0x10;}

               virtual void parenta_f2() {this->parenta_a = 0x20;}

             

            public:  

               void parenta_f3() {this->parenta_a = 0x30;}

               void parenta_f4() {this->parenta_a = 0x40;}

            };

            看看構造函數的匯編代碼:

               CParentA() {}

            00401330 55               push        ebp 

            00401331 8B EC            mov         ebp,esp

            00401333 51               push        ecx 

            00401334 89 4D FC         mov         dword ptr [ebp-4],ecx

            00401337 8B 45 FC         mov         eax,dword ptr [this]

            0040133A C7 00 60 68 40 00 mov         dword ptr [eax],offset CParentA::`vftable' (406860h)

            00401340 8B 45 FC         mov         eax,dword ptr [this]

            00401343 8B E5            mov         esp,ebp

            00401345 5D               pop         ebp 

            00401346 C3               ret             

            從這里發現了兩行很有意思的代碼:

            00401337 8B 45 FC         mov         eax,dword ptr [this]

            0040133A C7 00 60 68 40 00 mov         dword ptr [eax],offset CParentA::`vftable' (406860h)

            我們知道在有vtbl的情況下,this指向的前四個字節用來存放vtbl的指針。原來在構造函數里還有一個工作是要設置vtbl的指針。難怪C++非要在里面插入一個構造函數。

            刪除我們自己寫的構造函數,再構造一個CParentA的對象。

               CParentA pa;

            0040111E 8D 4D F0         lea         ecx,[pa]

            00401121 E8 39 FF FF FF   call        CParentA::CParentA (40105Fh)

            還是要調用CParentA::CParentA,看看它做了什么:

            CParentA::CParentA:

            004013D0 55               push        ebp 

            004013D1 8B EC            mov         ebp,esp

            004013D3 51               push        ecx 

            004013D4 89 4D FC         mov         dword ptr [ebp-4],ecx

            004013D7 8B 45 FC         mov         eax,dword ptr [this]

            004013DA C7 00 60 68 40 00 mov         dword ptr [eax],offset CParentA::`vftable' (406860h)

            004013E0 8B 45 FC         mov         eax,dword ptr [this]

            004013E3 8B E5            mov         esp,ebp

            004013E5 5D               pop         ebp 

            004013E6 C3               ret             

            比較兩個構造函數的匯編代碼可以發現,它們并沒有什么不同。

            那么,假如一個類沒有虛函數,也就沒有vtbl,那么它是不是就不需要生成構造函數了呢?試試將CParentA里面的兩個虛函數去掉:

               CParentA pa;

             

            可以發現,這行代碼果然不再生成對構造函數的調用!

             

            posted on 2009-09-21 10:26 肥仔 閱讀(377) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

            99久久精品国内| 中文字幕久久波多野结衣av| www.久久热.com| 久久亚洲AV成人无码电影| 国产亚洲婷婷香蕉久久精品| 久久青草国产手机看片福利盒子| 色综合久久最新中文字幕| 一级做a爱片久久毛片| 久久99精品国产麻豆蜜芽| 亚洲国产精品一区二区三区久久| 国产成人久久精品一区二区三区 | 一本伊大人香蕉久久网手机| 久久精品国产亚洲7777| 伊人久久大香线蕉综合影院首页| 色综合久久综合中文综合网| 久久精品国产影库免费看| 国产99久久久国产精品~~牛 | 思思久久99热免费精品6| 欧美精品久久久久久久自慰| 久久久噜噜噜久久熟女AA片| 久久久久久久综合综合狠狠| 欧美激情一区二区久久久| 亚洲精品高清久久| 久久久久亚洲AV无码观看| 久久久91精品国产一区二区三区| 亚洲国产日韩欧美久久| 热re99久久精品国产99热| 久久人做人爽一区二区三区| 国产免费久久久久久无码| 久久无码中文字幕东京热| 国产精品亚洲综合专区片高清久久久| 久久综合色老色| 丰满少妇人妻久久久久久4| 久久精品人人做人人爽97| 99久久香蕉国产线看观香 | 国产福利电影一区二区三区,免费久久久久久久精| 久久国产精品久久精品国产| 无码伊人66久久大杳蕉网站谷歌 | 热99RE久久精品这里都是精品免费| 久久亚洲精品成人AV| 国内精品久久国产|