• <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>
            隨筆 - 31  文章 - 128  trackbacks - 0
            <2007年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(5)

            隨筆分類(38)

            隨筆檔案(31)

            收藏夾(4)

            College

            High School

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 55891
            • 排名 - 407

            最新評(píng)論

            • 1.?re: [yc]詳解link
            • 面試的時(shí)候面試官就問過我什么是編譯和鏈接,我說編譯就是把代碼文件生成目標(biāo)文件,鏈接就是把目標(biāo)文件生成可執(zhí)行文件,他說不對(duì),又問我什么是動(dòng)態(tài)鏈接,還問我預(yù)編譯都做什么處理。。。都在這里找到了答案!!!!
            • --王至乾
            • 2.?re: [yc]詳解link
            • @劉偉
              我是說博主,不是叫你啊
            • --溪流
            • 3.?re: [yc]詳解link
            • 誰(shuí)是石老師,我不是哈@溪流
            • --劉偉
            • 4.?re: [yc]詳解link
            • 石老師?我是溪流~
            • --溪流
            • 5.?re: [yc]詳解link
            • 期待樓主下文啊,多謝樓主了
            • --劉偉

            閱讀排行榜

            評(píng)論排行榜

                近日在學(xué)校bbs上與人討論C++的typeid關(guān)鍵字的實(shí)現(xiàn)問題,有人提到type_info的地址是存放在虛表的第一個(gè)位置上,頗覺得不妥,于是我在vc2003下實(shí)驗(yàn)了一番

                在vc下,使用typeid的時(shí)候,如果typeid施加給的類型是沒有vptr的class或者根本不是class
            那么匯編是
            mov  dword ptr [addr],offset A `RTTI Type Descriptor' (42AD40h)
            也就是編譯器生成一個(gè)簡(jiǎn)單的type_info對(duì)象的表,并且在編譯期靜態(tài)決定下標(biāo),做一個(gè)簡(jiǎn)單查表操作。

            如果typeid的操作對(duì)象是具有vptr的class,但是并不是一個(gè)引用或者指針的解引用形式,例如

            A a;
            typeid(a);


            那么仍然僅僅會(huì)做查表操作


            如果typeid的操作對(duì)象是具有vptr的class,并且是引用或者指針的解引用形式,例如

            * =   new  A;
            A
            &  r  =   * p;
            typeid(
            * p);
            typeid(r);


            那么就會(huì)調(diào)用一個(gè)叫___RTtypeid的函數(shù),并通過某種方法來獲取type_info對(duì)象
            下面是___RTtypeid的反匯編,這里只列出關(guān)鍵的幾條指令

            0041213E  mov         ecx,dword ptr [inptr]    ;inptr是對(duì)象的地址
            00412141   mov         edx,dword ptr [ecx] 
            00412143   mov         eax,dword ptr [edx - 4
            0041215F  mov         ecx,dword ptr [eax
            + 0Ch] 
            00412162   mov         dword ptr [ebp - 48h],ecx 
            0041216C  mov         eax,dword ptr [ebp
            - 48h] 


            基本上等價(jià)于C語(yǔ)言的

            int  a1  =  ( int )p;  // p是對(duì)象的地址
            int  a2  =   * ( int * )a1  -   4 ;
            int  a3  =   * ( int * )a2  +   12 ;
            int  a4  =   * ( int * )a3;

             

            那么從這段代碼可以看出vc下type_info對(duì)象的存放位置[如下圖]



            也就虛表下標(biāo)為-1的位置上存放了一個(gè)指向一個(gè)未知的表的指針(暫且將此表命名為runtime_info_table)
            runtime_info_table的第4格上存放了type_info對(duì)象的地址
            至于runtime_info_table里前3格上存放的是什么, 還需要再研究研究
            一般來說它們?nèi)?, 但是對(duì)于多重虛繼承的類, 第二格上會(huì)是4, 可能和指針的偏移量有關(guān).

            posted on 2006-10-26 10:46 shifan3 閱讀(3349) 評(píng)論(5)  編輯 收藏 引用 所屬分類: C++

            FeedBack:
            # re: VC下typeid實(shí)現(xiàn)及內(nèi)存布局分析 2006-10-26 18:00 jj
            我怎么測(cè)試的時(shí)候,帶vtpr的類也是mov dword ptr [addr],offset A `RTTI Type Descriptor' (42AD40h)
              回復(fù)  更多評(píng)論
              
            # re: VC下typeid實(shí)現(xiàn)及內(nèi)存布局分析 2006-10-26 20:42 Francis Arcanum
            首先要開rtti開關(guān)
            然后必須這樣測(cè)試才行
            class A
            {
            public:
            virtual void f(){}
            };
            class B : public A{};
            A* p = new B;
            A& r = *p;
            typeid(*p);
            typeid(r);
            也就是能夠調(diào)用___RTtypeid的東西必須是指針解引用或者引用
            對(duì)象實(shí)體和其他類型由于實(shí)際類型在編譯器就能固定,就直接查表了  回復(fù)  更多評(píng)論
              
            # re: VC下typeid實(shí)現(xiàn)及內(nèi)存布局分析 2006-12-09 22:47 euclid
            驗(yàn)證了我的想法。  回復(fù)  更多評(píng)論
              
            # re: [yc]VC下typeid實(shí)現(xiàn)及內(nèi)存布局分析 2007-08-21 00:01 非非是是(||)
            那typeid(1);呢
            >int
              回復(fù)  更多評(píng)論
              
            # re: [yc]VC下typeid實(shí)現(xiàn)及內(nèi)存布局分析 2007-08-21 15:05 Francis Arcanum
            @非非是是(||)
            mov dword ptr [addr],offset A `RTTI Type Descriptor' (42AD40h)
            直接查表  回復(fù)  更多評(píng)論
              
            韩国三级中文字幕hd久久精品| 香蕉aa三级久久毛片| 国产精品禁18久久久夂久| 粉嫩小泬无遮挡久久久久久| 青青草国产成人久久91网| 久久丝袜精品中文字幕| 久久精品国产亚洲av日韩| 91久久国产视频| 一级做a爰片久久毛片免费陪| 久久国产亚洲精品无码| 久久精品无码一区二区日韩AV| 久久99精品久久久大学生| 精品久久久久久无码人妻蜜桃| 无遮挡粉嫩小泬久久久久久久| 国产免费久久精品99久久| 久久精品无码专区免费青青| 久久丝袜精品中文字幕| 久久99毛片免费观看不卡| 久久九九兔免费精品6| 久久亚洲高清综合| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久国产精品99久久久久久老狼| 久久久久亚洲精品中文字幕| 国产精品一久久香蕉国产线看| 精品久久久一二三区| 国产精品九九久久免费视频 | 久久精品国产一区二区三区不卡| 亚洲国产精品久久电影欧美| 亚洲美日韩Av中文字幕无码久久久妻妇| 人妻无码中文久久久久专区| 久久91精品国产91久| 久久精品国产精品亚洲精品| 色青青草原桃花久久综合| 久久精品无码免费不卡| 欧美激情精品久久久久久久| 免费精品久久久久久中文字幕| 久久久久一本毛久久久| 一级女性全黄久久生活片免费 | www.久久热.com| 久久亚洲欧美日本精品| 97久久超碰国产精品2021|