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

            天下

            記錄修行的印記

            pin_ptr 和 interior_ptr

            CLR語法中,值類型指針分為兩種類型:V*(限于非 CLR 堆位置)和內(nèi)部指針 interior_ptr<V>(允許但不要求托管堆內(nèi)的地址)。


            釘住指針
            通常,在壓縮階段,垃圾回收器可選擇將駐留在 CLR 堆上的對(duì)象移動(dòng)到堆內(nèi)的不同位置。這種移動(dòng)對(duì)于跟蹤句柄、跟蹤引用和內(nèi)部指針而言不是問題,它們都透明地更新這些實(shí)體。但是,如果用戶在運(yùn)行時(shí)環(huán)境外傳遞了 CLR 堆上對(duì)象的地址,這種移動(dòng)就會(huì)導(dǎo)致問題。在這種情況下,對(duì)象的不穩(wěn)定運(yùn)動(dòng)可能導(dǎo)致運(yùn)行時(shí)失敗。要避免此類對(duì)象的移動(dòng),必須在本地將它們釘在自己的位置上以供外部使用。

            在托管擴(kuò)展中,“釘住指針”是通過使用 __pin 關(guān)鍵字限定指針聲明來聲明的。下面是一個(gè)來自托管擴(kuò)展規(guī)范的經(jīng)過略微修改的示例:

              復(fù)制代碼 
            __gc struct H { int j; };

            int main() 
            {
               H * h = new H;
               int __pin * k = & h -> j;
              
               // …
            };
             

            在新的語言設(shè)計(jì)中,釘住指針是使用類似于內(nèi)部指針的語法來聲明的。

              復(fù)制代碼 
            ref struct H
            {
            public:
               int j;
            };

            int main()
            {
               H^ h = gcnew H;
               pin_ptr<int> k = &h->j;

               // …
            }



            interior_ptr
            Declares a pointer to inside a reference type, but not to the object itself. An interior pointer can point to a reference handle, value type, boxed type handle, member of a managed type, or to an element of a managed array. 
            cli::interior_ptr<cv_qualifier type> var = &initializer;

            Remarks
            A native pointer is not able to track an item as its location changes on the managed heap, which results from the garbage collector moving instances of an object. In order for a pointer to correctly refer to the instance, the runtime needs to update the pointer to the newly positioned object.

            An interior_ptr represents a superset of the functionality of a native pointer. Therefore, anything that can be assigned to a native pointer can also be assigned to an interior_ptr. An interior pointer is permitted to perform the same set of operations as native pointers, including comparison and pointer arithmetic.

            An interior pointer can only be declared on the stack. An interior pointer cannot be declared as a member of a class.

            Since interior pointers exist only on the stack, taking the address of an interior pointer yields an unmanaged pointer.

            interior_ptr has an implicit conversion to bool, which allows for its use in conditional statements.

            For information on how to declare an interior pointer that points into an object that cannot be moved on the garbage-collected heap, see pin_ptr.

            interior_ptr is in the cli namespace. See cli Namespace for more information.


            //Example
            // interior_ptr.cpp
            // compile with: /clr
            using namespace System;

            ref class MyClass {
            public:
               int data;
            };

            int main() {
               MyClass ^ h_MyClass = gcnew MyClass;
               h_MyClass->data = 1;
               Console::WriteLine(h_MyClass->data);

               interior_ptr<int> p = &(h_MyClass->data);
               *p = 2;
               Console::WriteLine(h_MyClass->data);

               // alternatively
               interior_ptr<MyClass ^> p2 = &h_MyClass;
               (*p2)->data = 3;
               Console::WriteLine((*p2)->data);
            }

             


             

            posted on 2015-12-21 17:11 天下 閱讀(1094) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++ 、C#

            <2016年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評(píng)論

            国内精品综合久久久40p| 麻豆成人久久精品二区三区免费| 亚洲色大成网站www久久九| 久久久国产视频| 亚洲午夜久久久久久噜噜噜| 久久综合亚洲色一区二区三区| 久久97精品久久久久久久不卡| 99久久精品久久久久久清纯| 中文精品99久久国产 | 伊人久久精品线影院| 久久97久久97精品免视看秋霞| 久久亚洲AV无码精品色午夜| 久久午夜羞羞影院免费观看| 中文字幕亚洲综合久久| 伊人久久综合无码成人网| 欧美日韩中文字幕久久伊人| 新狼窝色AV性久久久久久| 日韩美女18网站久久精品| 久久久久久久99精品免费观看| 青草久久久国产线免观| 99久久精品国产麻豆| 色8久久人人97超碰香蕉987| 精品久久久久一区二区三区| 国产精品女同久久久久电影院| 久久亚洲精品中文字幕| 午夜视频久久久久一区| 99久久免费国产精品| 精品少妇人妻av无码久久| 国产精品久久婷婷六月丁香| 伊人热人久久中文字幕| 精品无码久久久久国产| 欧美大香线蕉线伊人久久| 久久笫一福利免费导航 | 久久精品国产亚洲AV影院| 色狠狠久久综合网| 久久久噜噜噜久久中文字幕色伊伊| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久国产午夜精品一区二区三区| 国产亚州精品女人久久久久久| 精品久久久久久久久午夜福利| 久久人人添人人爽添人人片牛牛|