校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Lua的內(nèi)存管理淺析

Lua的內(nèi)存管理淺析

熱門標(biāo)簽:新岸線智能電銷機(jī)器人 百度地圖標(biāo)注早餐區(qū)域 清朝地圖標(biāo)注哈爾濱 個(gè)人怎么在地圖標(biāo)注需要的店鋪 怎么去除地圖標(biāo)注 冀州市地圖標(biāo)注 地圖標(biāo)注大廈 漳州智云呼電話機(jī)器人 武漢外呼防封系統(tǒng)多少錢

前言

在歷史長河中,各種各樣的新語言,總是伴隨著我們編程人員;有的時(shí)候,工作的需要,我們不得不去學(xué)習(xí)這些很炫的,很新的語言。學(xué)習(xí)任何一門語言(我這里只說學(xué)習(xí)),都無非就是學(xué)習(xí)那么幾個(gè)大模塊,基本語法,標(biāo)準(zhǔn)庫,函數(shù)或面向?qū)ο螅瑑?nèi)存管理。而對于Lua的學(xué)習(xí),前面幾個(gè)模塊我都已經(jīng)總結(jié)完畢了,而今天這篇文章主要是總結(jié)Lua中的內(nèi)存管理。

Lua在兩個(gè)層面提供了對這些定制的支持。在較低層面,可以設(shè)置Lua使用的分配函數(shù);在較高層面,可以設(shè)置一些控制垃圾收集器的參數(shù),或者直接控制垃圾收集器。現(xiàn)在就開始這一篇的旅行吧。

分配函數(shù)

Lua是通過一個(gè)“分配函數(shù)”來完成所有的內(nèi)存分配和釋放操作。當(dāng)用戶創(chuàng)建一個(gè)Lua狀態(tài)時(shí),必須提供這個(gè)函數(shù)。之前的代碼中總是會用到一個(gè)luaL_newstate輔助函數(shù),這個(gè)函數(shù)會以一個(gè)默認(rèn)的分配函數(shù)來創(chuàng)建Lua狀態(tài)。默認(rèn)的分配函數(shù)使用了C標(biāo)準(zhǔn)庫中的malloc-realloc-free函數(shù),對于普通的應(yīng)用程序這已經(jīng)足夠了,然而,要獲取對Lua內(nèi)存分配的完全控制也是非常容易的,只需要用原始的lua_newstate來創(chuàng)建狀態(tài)就可以了:

復(fù)制代碼 代碼如下:

lua_State *lua_newstate(lua_Alloc f, void *ud);

這個(gè)函數(shù)接收兩個(gè)參數(shù):分配函數(shù)和用戶數(shù)據(jù)。以這種方式創(chuàng)建的狀態(tài)會調(diào)用f來完成所有的內(nèi)存分配和釋放。由于分配內(nèi)存的策略很多,而對于lua_Alloc分配函數(shù)的分析和講解,也不是這篇文章的重點(diǎn);這篇文章,只是對Lua內(nèi)存管理進(jìn)行簡單的說明,讓你知道有這么個(gè)東西,有這么回事,那么我的這篇文章就達(dá)到目的了。

垃圾收集器

Lua在5.0版之前,都是采用的一種簡單的“標(biāo)記并清理”的垃圾收集器。這種垃圾清理的每個(gè)周期由4個(gè)階段組成:標(biāo)記、整理、清掃和收尾。Lua有時(shí)會為了完成一個(gè)完整的垃圾收集周期而暫停與主程序的交互。接下來,就對一個(gè)垃圾清理周期中的每個(gè)階段進(jìn)行詳細(xì)的說明。

在標(biāo)記階段,Lua先將“根集合”中的對象標(biāo)記為“活躍”。根集合中的對象就是Lua可以直接訪問的對象,它們是注冊表中的對象和主線程對象。然后,Lua將任何程序可以通過根集合對象訪問到的對象也都標(biāo)記為“活躍”。這樣會使所有可到達(dá)的對象都標(biāo)記為“活躍”了。

在開始清掃階段前,Lua先要進(jìn)入整理階段。這個(gè)階段為“終結(jié)函數(shù)”和弱引用table。首先,Lua遍歷所有的userdata,找出所有未被標(biāo)記且具有–gc元方法的userdata。然后,將這些userdata標(biāo)記為“活躍”,并放入一個(gè)單獨(dú)的列表中。這個(gè)列表在收尾階段會用到。另一方面,Lua還會遍歷所有的弱引用table,并根據(jù)弱引用設(shè)置刪除其中未被標(biāo)記的key和value。

在清掃階段中,Lua遍歷所有的對象。如果當(dāng)前遍歷到的對象未被標(biāo)記,就收集它。否則,Lua就清除它的標(biāo)記,從而為下一個(gè)收集周期做準(zhǔn)備。

最后是收尾階段,其中會根據(jù)整理階段中生成的userdata列表來調(diào)用它們的終結(jié)函數(shù)。在最后才進(jìn)行這些調(diào)用是為了簡化錯(cuò)誤處理。

對于垃圾收集器的一些API,這些API,我這里就不總結(jié)。而這篇文章也就到此結(jié)束了。一篇剪短的文章,只是帶著大家過一下啊Lua的內(nèi)存管理規(guī)則,對于細(xì)節(jié)的問題,并沒有過多的涉及,在以后的編程中,遇到了,再細(xì)說。Lua系列也就暫時(shí)告一段落了,以后,如果遇到什么問題,還會繼續(xù)添加新的Lua文章的。希望我的Lua系列對大家有一定的幫助,也希望大家多多給我提出一些意見。

標(biāo)簽:儋州 臺灣 德宏 金昌 天門 宣城 天門 濰坊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua的內(nèi)存管理淺析》,本文關(guān)鍵詞  Lua,的,內(nèi)存,管理,淺析,Lua,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua的內(nèi)存管理淺析》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua的內(nèi)存管理淺析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 龙山县| 永州市| 丹凤县| 民县| 旬阳县| 清丰县| 塘沽区| 邵武市| 忻州市| 靖西县| 淮滨县| 忻州市| 东丰县| 广丰县| 西乌珠穆沁旗| 西乌珠穆沁旗| 长丰县| 高州市| 正定县| 苍南县| 福清市| 徐汇区| 芮城县| 翼城县| 勐海县| 淮滨县| 桃江县| 崇信县| 扶沟县| 黔南| 时尚| 老河口市| 兴宁市| 田林县| 栾川县| 淳化县| 华宁县| 内丘县| 西藏| 香河县| 新蔡县|