日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LUA GC 简单测试

發布時間:2025/3/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LUA GC 简单测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LUA GC 簡單測試

function table.count(t)if type(t) ~= "table" thenassert(false)returnendlocal n = 0for k, _ in pairs(t) don = n + 1endreturn n endlocal t = {x1 = "hello",x2 = "world",[1] = "x1111", }print(table.count(t)) t.x1 = nilcollectgarbage()print(table.count(t))

?弱引用的GC:LUA和C#一樣,也分值類型:數值,BOOL;?引用類型:LUA表,線程,協程,function, userdata。

弱引用最好只用在引用類型上,若用在數值類型及非構造類型,如數值,字符串等則會出現手動GC不能起作用的現象。

1 weakTable = {} 2 weakTable[1] = function() print("i am the first element") end 3 weakTable[2] = function() print("i am the second element") end 4 weakTable[3] = {1, 2, 3} 5 weakTable[4] = 12 6 weakTable[5] = {1, 2, 32} 7 8 setmetatable(weakTable, {__mode = "v"}) -- 設置為弱表 9 10 print(table.getn(weakTable)) 11 12 ele = weakTable[1] 13 collectgarbage() 14 print(table.getn(weakTable)) 15 16 ele = nil 17 weakTable[2] = nil 18 weakTable[3] = nil 19 weakTable[4] = nil --若將這句注釋掉,則會發現GC出問題了:只有weakTable[1]被GC了 20 21 collectgarbage() 22 print(table.getn(weakTable))

?

?

弱表(weak table)是一個很有意思的東西,像C++/Java等語言是沒有的。弱表的定義是:A weak table is a table whose elements are weak references,元素為弱引用的表就叫弱表。有弱引用那么也就有強引用,有引用那么也就有非引用。我們先要厘這些基本概念:變量、值、類型、對象。

  (1)變量與值:Lua是一個dynamically typed language,也就是說在Lua中,變量沒有類型,它可以是任何東西,而值有類型,所以Lua中沒有變量類型定義這種東西。另外,Lua中所有的值都是第一類值(first-class values)。

  (2)Lua有8種基本類型:nil、boolean、number、string、function、userdata、thread、table。其中Nil就是nil變量的類型,nil的主要用途就是一個所有類型之外的類型,用于區別其他7中基本類型。

  (3)對象objects:Tables、functins、threads、userdata。對于這幾種值類型,其變量皆為引用類型(變量本身不存儲類型數據,而是指向它們)。賦值、參數傳遞、函數返回等都操作的是這些值的引用,并不產生任何copy行為。

?  

  Lua的垃圾回收機制:gc是很多語言的常見機制,讓程序員拜托復雜易出錯的內存管理。

  定義:Lua manages memory automatically by running a?garbage collector?to collect all?dead objects?(that is, objects that are no longer accessible from Lua).?

  三點理解:(1)gc自動運行,也可以手動調用;(2)自動收集的目標是引用計數為0的對象;(3)dead objects:不能訪問到的對象,沒有引用指向它了,當然就是訪問不到的了,也就等同于垃圾內存了。

?

  weak table的定義:

  (1)weak表是一個表,它擁有metatable,并且metatable定義了__mode字段;

  (2)weak表中的引用是弱引用(weak reference),弱引用不會導致對象的引用計數變化。換言之,如果一個對象只有弱引用指向它,那么gc會自動回收該對象的內存。

  (3)__mode字段可以取以下三個值:k、v、kv。k表示table.key是weak的,也就是table的keys能夠被自動gc;v表示table.value是weak的,也就是table的values能被自動gc;kv就是二者的組合。任何情況下,只要key和value中的一個被gc,那么這個key-value pair就被從表中移除了(?In any case, if either the key or the value is collected, the whole pair is removed from the table)。

posted on 2016-10-27 12:52 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏

總結

以上是生活随笔為你收集整理的LUA GC 简单测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。