• <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
            數(shù)據(jù)加載中……

            VC下typeid實現(xiàn)及內(nèi)存布局分析

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

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

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

            A a;
            typeid(a);


            那么仍然僅僅會做查表操作


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

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


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

            0041213E  mov         ecx,dword ptr [inptr]    ;inptr是對象的地址
            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]


            基本上等價于C語言的

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

             

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



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

            posted on 2008-07-08 11:24 肥仔 閱讀(676) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

            久久精品国产欧美日韩99热| 久久久WWW成人免费毛片| 国产精品免费久久久久久久久| 久久综合九色综合97_久久久| 国产午夜精品理论片久久影视 | 99久久综合狠狠综合久久| 久久人做人爽一区二区三区| 久久精品一本到99热免费| 久久综合精品国产一区二区三区| 久久强奷乱码老熟女网站 | 亚洲狠狠综合久久| 久久久久se色偷偷亚洲精品av| 欧美激情精品久久久久久| 久久久国产精品| 国产精品久久久久久久人人看| 久久精品无码一区二区三区| 国产精品久久永久免费| 国产毛片欧美毛片久久久| 国产精品无码久久久久| 亚洲国产日韩欧美久久| 国产精品久久久天天影视香蕉| 久久男人AV资源网站| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 久久一区二区三区免费| 精品久久久无码21p发布| 国产成人精品免费久久久久| 久久精品国产亚洲av麻豆图片 | 久久久久se色偷偷亚洲精品av| 国产午夜精品久久久久免费视| 国産精品久久久久久久| 狠狠色丁香婷婷综合久久来| 久久久久女教师免费一区| 一本色道久久88精品综合 | 精品久久久久国产免费| 日韩精品久久无码人妻中文字幕| 亚洲一区精品伊人久久伊人 | 怡红院日本一道日本久久| 久久午夜免费视频| 人人狠狠综合久久亚洲88| 久久精品aⅴ无码中文字字幕不卡| 香港aa三级久久三级|