• <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>
            OldJiang.com

            浩毛的博客

            OldJiang.com
            posts - 14, comments - 81, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Lua的weak table和Userdata

            Posted on 2011-08-11 14:33 浩毛 閱讀(7045) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Lua腳本
            weak table是什么意思,建議不要看中文翻譯的,我以前看了半天還是沒懂啥子意思.

            lua 手冊(cè)原文是這樣解釋的:
            A weak table is a table whose elements are weak references. A weak reference is ignored by the garbage collector. In other words, if the only references to an object are weak references, then the garbage collector will collect this object.
            A weak table can have weak keys, weak values, or both. A table with weak keys allows the collection of its keys, but prevents the collection of its values. A table with both weak keys and weak values allows the collection of both keys and values. In any case, if either the key or the value is collected, the whole pair is removed from the table. The weakness of a table is controlled by the __mode field of its metatable. If the __mode field is a string containing the character 'k', the keys in the table are weak. If __mode contains 'v', the values in the table are weak.
            After you use a table as a metatable, you should not change the value of its __mode field. Otherwise, the weak behavior of the tables controlled by this metatable is undefined.

            在lua中,像table,userdata,function這些類型的值都是引用傳遞,通過引用計(jì)數(shù)來判斷是否收掉對(duì)象,而弱引用(weak reference)會(huì)被垃圾回收器忽略.weak table就是它的元素是弱引用的,一個(gè)元素(鍵值對(duì))可能鍵是弱引用,也可能值是弱引用的,也可能都是弱引用, 這個(gè)特性是通過弱表的metatable的__mode的值來設(shè)置的,特別有意思的是,當(dāng)弱表中一個(gè)鍵值對(duì),它的鍵或值關(guān)聯(lián)(引用/指向)的那個(gè)對(duì)象被垃圾回收器回收的時(shí)候,這個(gè)鍵值對(duì)會(huì)從弱表中被自動(dòng)刪除掉.這是個(gè)很重要的特點(diǎn).

            那么弱表到底有什么用呢? 在lua的wiki中有一篇使用userdata的例子 ,其中就很巧妙的用到了弱表,原文地址 http://lua-users.org/wiki/CppBindingWithLunar
            這篇文章介紹了如何通過userdata綁定c++對(duì)象到腳本中
            fulluserdata能夠設(shè)置metatable,也就能模擬出對(duì)象的效果出來,對(duì)一個(gè)C++的類的對(duì)象實(shí)例來說,push到腳本中,一般是創(chuàng)建了一個(gè)userdata,文章中用弱表避免了同一個(gè)對(duì)象實(shí)例(指針) push到腳本中,多次創(chuàng)建userdata的問題.
            換句話來說,如果C++對(duì)象的生存周期是靠lua的垃圾回收來控制的話(userdata被回收時(shí),調(diào)用元表的__gc方法,__gc方法中析構(gòu)c++對(duì)象),一個(gè)C++對(duì)象只能有一個(gè)唯一的userdata. 在userdata的metatable中創(chuàng)建一個(gè)值是弱引用的弱表,用C++對(duì)象指針做鍵,每次push c++對(duì)象的時(shí)候,就去用指針值查弱表,如果有,就push那個(gè)userdata,沒有就創(chuàng)建,  同時(shí),當(dāng)userdata是被弱引用的,當(dāng)被垃圾回收掉的時(shí)候,弱表中它所在的鍵值對(duì)自動(dòng)被銷毀了. 




            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            OldJiang.com
            久久人人爽人人人人片av| 色婷婷综合久久久久中文字幕 | 91精品国产综合久久精品| 欧美午夜精品久久久久免费视| 无码专区久久综合久中文字幕 | 老色鬼久久亚洲AV综合| 国产精品久久久久久搜索 | 99精品久久精品一区二区| 波多野结衣中文字幕久久| 久久影视国产亚洲| 人妻久久久一区二区三区| 国产精品嫩草影院久久| 久久夜色精品国产网站| 九九久久精品无码专区| 91精品国产91久久久久福利| 综合久久给合久久狠狠狠97色 | 久久精品三级视频| 国产69精品久久久久777| 亚洲国产视频久久| 国产精品VIDEOSSEX久久发布| 亚洲午夜无码久久久久| 欧美粉嫩小泬久久久久久久| 国产99精品久久| 色综合久久久久综合体桃花网| 午夜精品久久久内射近拍高清| 香蕉久久一区二区不卡无毒影院| 久久国语露脸国产精品电影| 久久综合伊人77777| 久久青青草原精品国产不卡| 7国产欧美日韩综合天堂中文久久久久 | 久久精品卫校国产小美女| 久久人人超碰精品CAOPOREN| 久久久久国产视频电影| 国产女人aaa级久久久级| 色综合久久综精品| 青草影院天堂男人久久| 久久精品嫩草影院| 国产精品美女久久久网AV| 精品久久久久久国产牛牛app | 久久九九亚洲精品| 色成年激情久久综合|