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

            天下

            記錄修行的印記

            Double Thunking


            By default, when compiling with /clr (not /clr:pure), the definition of a managed function causes the compiler to generate a managed entry point and a native 

            entry point. This allows the managed function to be called from native and managed call sites. However, when a native entry point exists, it can be the entry 
            point for all calls to the function. If a calling function is managed, the native entry point will then call the managed entry point. In effect, two calls 
            are required to invoke the function (hence, double thunking). For example, virtual functions are always called through a native entry point.
            One resolution is to tell the compiler not to generate a native entry point for a managed function, that the function will only be called from a managed 
            context, by using the __clrcall calling convention.
            Similarly, if you export (dllexport, dllimport) a managed function, a native entry point is generated and any function that imports and calls that function 
            will call through the native entry point. To avoid double thunking in this situation, do not use native export/import semantics; simply reference the 
            metadata via #using (see The #using Directive).
            In Visual C++ 2005 the compiler was updated to reduce unnecessary double thunking. For example, any function with a managed type in the signature (including 
            return type) will implicitly be marked as __clrcall. For more information on double thunk elimination, see 
            http://msdn.microsoft.com/msdnmag/issues/05/01/COptimizations/default.aspx.
            Example
            The following sample demonstrates double thunking. When compiled native (without /clr), the call to the virtual function in main generates one call to T's 
            copy constructor and one call to the destructor. Similar behavior is achieved when the virtual function is declared with /clr and __clrcall. However, when 
            just compiled with /clr, the function call generates a call to the copy constructor but there is another call to the copy constructor due to the 
            native-to-managed thunk.
            純 MSIL 程序集可以調用非托管函數,但不能由非托管函數調用。因此,與非托管函數使用的服務器代碼相比,純 MSIL 更適合于使用非托管函數的客戶端代碼。
            當我們使用/clr選項(不是/clr:pure)進行編譯的時候,一個托管函數(managed function),會導致編譯器生成一個托管的入口點(managed entry point)和一個原生的入口點
            (native entry point),這樣可以使得托管函數既可以被托管代碼調用,也可以被原生代碼調用。但是,當一個原生的入口點存在的時候,它將成為所有調用的入口點。也就是說
            如果調用者是托管的,它還是會先去調用原生入口點,然后原生的入口點再去調用托管的入口點,這就意味著調用了兩次函數入口點(Double Thunking)。 



            c++ cli 標準

            posted on 2015-12-01 11:14 天下 閱讀(335) 評論(0)  編輯 收藏 引用 所屬分類: C#

            <2015年12月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久亚洲日韩精品一区二区三区| 国产精品久久国产精品99盘 | 久久91精品久久91综合| 日本免费一区二区久久人人澡 | 久久久久一本毛久久久| 伊人久久大香线蕉成人| aaa级精品久久久国产片| 亚洲欧美日韩久久精品| 国产精品美女久久久| 色播久久人人爽人人爽人人片AV| 亚洲国产精品无码久久久秋霞2 | 欧美午夜A∨大片久久 | 思思久久99热只有频精品66| 91久久九九无码成人网站| 亚洲国产欧美国产综合久久| 久久久久噜噜噜亚洲熟女综合| 国内精品久久久久影院一蜜桃 | 国产精品久久久久久久久鸭| 久久国产免费直播| 午夜精品久久影院蜜桃| 狠狠色伊人久久精品综合网| AV狠狠色丁香婷婷综合久久| 亚洲va久久久噜噜噜久久 | 色狠狠久久AV五月综合| 亚洲日本va午夜中文字幕久久| 很黄很污的网站久久mimi色 | 久久亚洲视频| 久久久久亚洲AV成人网| 99久久精品国产一区二区| 久久91精品久久91综合| 久久婷婷国产麻豆91天堂| 国产精品一久久香蕉国产线看观看| 久久夜色精品国产亚洲| 97久久国产露脸精品国产| 亚洲综合精品香蕉久久网| 99精品国产免费久久久久久下载| 久久久久国产视频电影| 久久天天婷婷五月俺也去| 久久综合亚洲色HEZYO社区| 伊人久久精品无码二区麻豆| 久久久国产精品亚洲一区 |