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

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            C++構(gòu)造函數(shù)的幕后工作

            多年前學(xué)習(xí)C++的時(shí)候就知道每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造函數(shù),但是為什么要有這樣的規(guī)則卻一直不求甚解,汗一個(gè)。剛好最近在重新學(xué)習(xí)C++的內(nèi)存模型,看看它到底做了么事?

            寫一個(gè)簡單的類:

            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;}

            };

            看看構(gòu)造函數(shù)的匯編代碼:

               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             

            從這里發(fā)現(xiàn)了兩行很有意思的代碼:

            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指向的前四個(gè)字節(jié)用來存放vtbl的指針。原來在構(gòu)造函數(shù)里還有一個(gè)工作是要設(shè)置vtbl的指針。難怪C++非要在里面插入一個(gè)構(gòu)造函數(shù)。

            刪除我們自己寫的構(gòu)造函數(shù),再構(gòu)造一個(gè)CParentA的對(duì)象。

               CParentA pa;

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

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

            還是要調(diào)用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             

            比較兩個(gè)構(gòu)造函數(shù)的匯編代碼可以發(fā)現(xiàn),它們并沒有什么不同。

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

               CParentA pa;

             

            可以發(fā)現(xiàn),這行代碼果然不再生成對(duì)構(gòu)造函數(shù)的調(diào)用!

             

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

            午夜精品久久久久久中宇| 久久99精品久久久久久野外 | 国产亚洲精久久久久久无码AV| 久久精品国产亚洲AV无码麻豆| 国产一区二区精品久久| 免费精品久久久久久中文字幕| 久久福利资源国产精品999| 久久精品国产清高在天天线| 丁香五月综合久久激情| 狠狠精品久久久无码中文字幕 | 久久久国产99久久国产一| 久久精品国产91久久麻豆自制 | 青春久久| 国产精品美女久久久久AV福利| 免费久久人人爽人人爽av| 久久亚洲精品视频| 久久婷婷五月综合97色一本一本| 九九热久久免费视频| 99精品久久精品一区二区| 久久精品国产亚洲AV不卡| 久久99精品国产99久久6| 国内精品伊人久久久久| 久久狠狠高潮亚洲精品| 18岁日韩内射颜射午夜久久成人| 久久久久久久国产免费看| 久久99毛片免费观看不卡| 蜜臀av性久久久久蜜臀aⅴ麻豆| 无码任你躁久久久久久老妇| 国产综合免费精品久久久| 久久精品国产亚洲麻豆| 国产精品久久久久影院嫩草| 精品久久久久久久久午夜福利| 少妇久久久久久久久久| 久久婷婷五月综合97色| 久久久久亚洲AV成人片| 久久精品国产亚洲AV无码娇色| 久久久精品国产sm调教网站| 国内精品久久久久伊人av| 久久国产精品一国产精品金尊| 久久亚洲美女精品国产精品| 国产精品久久久久AV福利动漫|