• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Lua的weak table和Userdata

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

            lua 手冊原文是這樣解釋的:
            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這些類型的值都是引用傳遞,通過引用計數來判斷是否收掉對象,而弱引用(weak reference)會被垃圾回收器忽略.weak table就是它的元素是弱引用的,一個元素(鍵值對)可能鍵是弱引用,也可能值是弱引用的,也可能都是弱引用, 這個特性是通過弱表的metatable的__mode的值來設置的,特別有意思的是,當弱表中一個鍵值對,它的鍵或值關聯(引用/指向)的那個對象被垃圾回收器回收的時候,這個鍵值對會從弱表中被自動刪除掉.這是個很重要的特點.

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



            OldJiang.com
            亚洲AV无码久久精品狠狠爱浪潮| 一本久久a久久精品vr综合| 国产午夜免费高清久久影院 | 久久最新免费视频| 人妻无码久久精品| 亚洲午夜无码久久久久| 日韩精品国产自在久久现线拍| 青青青青久久精品国产h| 中文精品久久久久人妻| 久久综合狠狠综合久久| 久久久WWW成人免费精品| 国产69精品久久久久9999APGF | 国产精品一久久香蕉国产线看| 久久综合狠狠综合久久激情 | 久久精品中文騷妇女内射| 亚洲一本综合久久| 久久久久亚洲精品天堂| 久久一区二区三区99| 精品国产91久久久久久久| 日本五月天婷久久网站| 久久国产精品99久久久久久老狼 | 久久久免费观成人影院| 69SEX久久精品国产麻豆| 久久精品国产亚洲AV忘忧草18| 日韩精品久久久久久| 国产精品久久久久久| 色婷婷综合久久久久中文| 狠狠综合久久综合88亚洲| 亚洲国产香蕉人人爽成AV片久久| 日韩中文久久| 久久精品国产一区二区| 精品无码久久久久国产| 久久久久久久91精品免费观看| 香港aa三级久久三级| 国产精品久久久久久影院| 99久久人妻无码精品系列 | 久久精品www人人爽人人| 99久久99久久精品国产片果冻 | 欧美与黑人午夜性猛交久久久 | 狠狠色丁香久久综合婷婷| 国内精品伊人久久久久av一坑 |