亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2014年09月28日 13:03:09   投稿:junjie  
這篇文章主要介紹了Lua的內(nèi)存管理淺析,本文講解了內(nèi)存管理的相關(guān)知識(shí),同時(shí)講解了垃圾收集器的機(jī)制,需要的朋友可以參考下

前言

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

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

分配函數(shù)

Lua是通過(guò)一個(gè)“分配函數(shù)”來(lái)完成所有的內(nèi)存分配和釋放操作。當(dāng)用戶創(chuàng)建一個(gè)Lua狀態(tài)時(shí),必須提供這個(gè)函數(shù)。之前的代碼中總是會(huì)用到一個(gè)luaL_newstate輔助函數(shù),這個(gè)函數(shù)會(huì)以一個(gè)默認(rèn)的分配函數(shù)來(lái)創(chuàng)建Lua狀態(tài)。默認(rèn)的分配函數(shù)使用了C標(biāo)準(zhǔn)庫(kù)中的malloc-realloc-free函數(shù),對(duì)于普通的應(yīng)用程序這已經(jīng)足夠了,然而,要獲取對(duì)Lua內(nèi)存分配的完全控制也是非常容易的,只需要用原始的lua_newstate來(lái)創(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)會(huì)調(diào)用f來(lái)完成所有的內(nèi)存分配和釋放。由于分配內(nèi)存的策略很多,而對(duì)于lua_Alloc分配函數(shù)的分析和講解,也不是這篇文章的重點(diǎn);這篇文章,只是對(duì)Lua內(nèi)存管理進(jìn)行簡(jiǎn)單的說(shuō)明,讓你知道有這么個(gè)東西,有這么回事,那么我的這篇文章就達(dá)到目的了。

垃圾收集器

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

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

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

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

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

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

相關(guān)文章

  • lua+love2d制作的2048游戲

    lua+love2d制作的2048游戲

    前面給大家分享的是一個(gè)超級(jí)簡(jiǎn)單版的使用lua實(shí)現(xiàn)的2048小游戲的代碼,今天我們加上love2d游戲引擎,制作PC版的2048游戲。小伙伴們仔細(xì)讀讀本文吧。
    2015-03-03
  • Lua5.1中加載dll動(dòng)態(tài)鏈接庫(kù)的方法

    Lua5.1中加載dll動(dòng)態(tài)鏈接庫(kù)的方法

    這篇文章主要介紹了Lua5.1中加載dll動(dòng)態(tài)鏈接庫(kù)的方法,本文講解了加載專門為lua寫的擴(kuò)展dll的方法和加載不是專為lua寫的擴(kuò)展dll的方法,需要的朋友可以參考下
    2015-05-05
  • 利用Lua定制Redis命令的方法詳解

    利用Lua定制Redis命令的方法詳解

    這篇文章主要給大家介紹了關(guān)于利用Lua定制Redis命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Lua中三種循環(huán)語(yǔ)句的使用講解

    Lua中三種循環(huán)語(yǔ)句的使用講解

    今天小編就為大家分享一篇關(guān)于Lua中三種循環(huán)語(yǔ)句的使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Mac平臺(tái)中編譯安裝Lua運(yùn)行環(huán)境及Hello Lua實(shí)例

    Mac平臺(tái)中編譯安裝Lua運(yùn)行環(huán)境及Hello Lua實(shí)例

    這篇文章主要介紹了Mac平臺(tái)中編譯安裝Lua運(yùn)行環(huán)境及Hello Lua實(shí)例,本文給出了兩種Hello Lua示例,一種是控制臺(tái)直接輸出,通過(guò)文件編譯輸出,需要的朋友可以參考下
    2014-10-10
  • 舉例說(shuō)明Lua中元表和元方法的使用

    舉例說(shuō)明Lua中元表和元方法的使用

    這篇文章主要介紹了舉例說(shuō)明Lua中元表和元方法的使用,文中--兩個(gè)橫線開(kāi)始單行的注釋,--[[加上兩個(gè)[和]表示多行的注釋--]],需要的朋友可以參考下
    2015-07-07
  • Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法)

    Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法)

    這篇文章主要介紹了Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法),本文同時(shí)講解了metatable、元方法等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Lua語(yǔ)言新手簡(jiǎn)單入門教程

    Lua語(yǔ)言新手簡(jiǎn)單入門教程

    這篇文章主要給大家介紹的是關(guān)于Lua語(yǔ)言新手入門的簡(jiǎn)單教程,文中通過(guò)示例代碼一步步介紹的非常詳細(xì),對(duì)各位新手們的入門提供了一個(gè)很方便的教程,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Lua性能優(yōu)化技巧(四):關(guān)于字符串

    Lua性能優(yōu)化技巧(四):關(guān)于字符串

    這篇文章主要介紹了Lua性能優(yōu)化技巧(四):關(guān)于字符串,本文講解了關(guān)于字符串的一些優(yōu)化技巧,需要的朋友可以參考下
    2015-04-04
  • Lua math.fmod使用時(shí)的小數(shù)問(wèn)題

    Lua math.fmod使用時(shí)的小數(shù)問(wèn)題

    這篇文章主要介紹了Lua math.fmod使用時(shí)的小數(shù)問(wèn)題,math.fmod用于取模運(yùn)算,使用小數(shù)時(shí)可能會(huì)遇到不可預(yù)料的結(jié)果,所以應(yīng)該避免使用小數(shù),需要的朋友可以參考下
    2015-06-06

最新評(píng)論