一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua的內存管理淺析

Lua的內存管理淺析

2020-04-13 10:55腳本之家 Lua

這篇文章主要介紹了Lua的內存管理淺析,本文講解了內存管理的相關知識,同時講解了垃圾收集器的機制,需要的朋友可以參考下

前言

在歷史長河中,各種各樣的新語言,總是伴隨著我們編程人員;有的時候,工作的需要,我們不得不去學習這些很炫的,很新的語言。學習任何一門語言(我這里只說學習),都無非就是學習那么幾個大模塊,基本語法,標準庫,函數或面向對象,內存管理。而對于Lua的學習,前面幾個模塊我都已經總結完畢了,而今天這篇文章主要是總結Lua中的內存管理。

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

分配函數

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

 

復制代碼 代碼如下:

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

 

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

垃圾收集器

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

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

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

在清掃階段中,Lua遍歷所有的對象。如果當前遍歷到的對象未被標記,就收集它。否則,Lua就清除它的標記,從而為下一個收集周期做準備。

最后是收尾階段,其中會根據整理階段中生成的userdata列表來調用它們的終結函數。在最后才進行這些調用是為了簡化錯誤處理。

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

延伸 · 閱讀

精彩推薦
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
主站蜘蛛池模板: 国产精品自在线拍 | 日韩一区二区不卡 | 蜜桃麻豆 | 我的美女奴隶 | 黑帮大佬与我的365天2标清中文 | 国产suv精品一区二区四区三区 | 91精品国产一区 | 扒开双腿疯狂进出爽爽动态图 | 无遮挡h肉动漫高清在线 | 激情影院费观看 | 三上悠亚国产精品一区 | 欧美一区二区日韩一区二区 | 日本久久啪啪婷婷激情五月 | 亚洲男人第一天堂 | 国产123区 | 国产成人咱精品视频免费网站 | 91午夜在线观看 | 欧美午夜精品久久久久久黑人 | 青青草精品在线 | 男男视频18免费网站 | 亚洲国产精品久久精品成人网站 | 91九色porny国产美女一区 | 国产在线精品一区二区高清不卡 | 婷婷精品 | 全肉np巨肉一女np高h双龙 | 天天av天天翘天天综合网 | 我们日本在线观看免费动漫下载 | 日本高清视频一区二区 | 欧美日韩一区二区三区在线播放 | 国产精品露脸国语对白河北 | 国产午夜精品久久理论片小说 | 欧美乱子伦xxxx12在线 | 免费一级特黄特色大片在线 | 精品久久洲久久久久护士免费 | chinesegay黑袜玩奴 | 人人爽人人草 | 欧美三级小视频 | 男人狂躁女人下半身 | 加勒比伊人 | 成人久久久 | 99九九精品免费视频观看 |