• <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 堆上的對象移動到堆內(nèi)的不同位置。這種移動對于跟蹤句柄、跟蹤引用和內(nèi)部指針而言不是問題,它們都透明地更新這些實體。但是,如果用戶在運行時環(huán)境外傳遞了 CLR 堆上對象的地址,這種移動就會導(dǎo)致問題。在這種情況下,對象的不穩(wěn)定運動可能導(dǎo)致運行時失敗。要避免此類對象的移動,必須在本地將它們釘在自己的位置上以供外部使用。

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

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

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

            在新的語言設(shè)計中,釘住指針是使用類似于內(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 天下 閱讀(1116) 評論(0)  編輯 收藏 引用 所屬分類: C/C++C#

            <2010年11月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            97久久精品人妻人人搡人人玩| 亚洲人成无码网站久久99热国产 | 久久午夜夜伦鲁鲁片免费无码影视| 色妞色综合久久夜夜| 久久SE精品一区二区| 国产精品久久久香蕉| 久久久久久精品无码人妻| 怡红院日本一道日本久久| 国产精品久久波多野结衣| 97精品久久天干天天天按摩| 亚洲伊人久久大香线蕉综合图片| 中文精品99久久国产 | 久久精品中文无码资源站| 久久久久久夜精品精品免费啦 | 亚洲国产小视频精品久久久三级 | 久久成人精品| 日韩人妻无码一区二区三区久久| 精品久久久久久久| 久久性精品| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品三级视频| 亚洲欧美成人综合久久久| 99久久亚洲综合精品成人| 狠狠色丁香婷婷久久综合五月 | 国产91久久精品一区二区| 久久电影网一区| 人妻少妇久久中文字幕一区二区| 久久精品国产亚洲7777| 亚洲中文久久精品无码| 国产高潮久久免费观看| 国内精品伊人久久久久777| 日韩精品国产自在久久现线拍 | 伊人久久无码精品中文字幕| 污污内射久久一区二区欧美日韩| 久久精品国产亚洲AV无码麻豆| 欧美性大战久久久久久| 久久精品国产69国产精品亚洲| 国产成人精品综合久久久久 | 99热精品久久只有精品| 性色欲网站人妻丰满中文久久不卡| 久久精品国产精品亜洲毛片 |