freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

lua50參考手冊(cè)-資料下載頁(yè)

2025-06-05 19:11本頁(yè)面
  

【正文】 行垃圾收集器,來(lái)釋放死對(duì)象的空間。一旦字節(jié)計(jì)數(shù)器被調(diào)整,那么閥值就會(huì)被設(shè)為字節(jié)計(jì)數(shù)器新值的兩倍。 通過(guò)C API,你可以查詢和更改閥值(見 )。將閥值設(shè)為零時(shí)會(huì)強(qiáng)制立刻進(jìn)行垃圾收集,同時(shí)把他設(shè)為足夠大就可以停止垃圾收集。僅使用Lua代碼中的 gcinfo 和 collectgarbage 函數(shù) (見 )可以獲得一定程度上對(duì)垃圾收集循環(huán)的控制。 垃圾收集元方法 (GarbageCollection Metamethods)使用 CAPI,你可以對(duì)用戶數(shù)據(jù)設(shè)置一個(gè)垃圾收集元方法(見 )。這些元方法也稱為 終結(jié)器(finalizers)。終結(jié)器允許你用外部的資源管理來(lái)調(diào)整Lua的垃圾收集(如關(guān)閉文件,網(wǎng)絡(luò)或數(shù)據(jù)庫(kù)連接,或者釋放你自己的內(nèi)存。 用元表中包含 __gc 字段的自由用戶數(shù)據(jù)不會(huì)立即被垃圾收集器回收。而是,Lua把它們放在一個(gè)列表中。收集完畢之后,Lua會(huì)對(duì)這個(gè)列表中的用戶數(shù)據(jù)執(zhí)行和以下函數(shù)相等的操作: function gc_event (udata) local h = metatable(udata).__gc if h then h(udata) end end在每個(gè)垃圾收集過(guò)程最后,調(diào)用用戶數(shù)據(jù)的終結(jié)器的順序,將按照他們?cè)谑占^(guò)程中添加到列表中的相反順序進(jìn)行。也就是,第一個(gè)被調(diào)用的終結(jié)器是和在程序中創(chuàng)建的最后一個(gè)用戶數(shù)據(jù)相關(guān)的那個(gè)終結(jié)器。 弱表一個(gè) 弱表(weak table) 是一個(gè)包含的元素是 弱引用(weak references)的表。垃圾收集器會(huì)忽略弱引用。換句話說(shuō),如果指向一個(gè)對(duì)象的引用只有弱引用,那么這個(gè)對(duì)象還是要被垃圾收集器回收。 弱表可以包含弱的鍵,弱的值,或者兩者皆有。一個(gè)包含弱鍵的表允許它的鍵被回收,但值不可以。一個(gè)同時(shí)包含弱鍵和弱值的表允許鍵和值的回收。無(wú)論哪種情況,只要鍵或者值中的一個(gè)被回收了,那么這一對(duì)鍵值將會(huì)從表中刪除。這個(gè)表的弱屬性是由它的元表的 __mode 字段控制的。如果 __mode 字段是一個(gè)包含字符`k180。的字符串,那么表中的鍵是弱鍵。如果 __mode 字段是一個(gè)包含字符 `v180。 的字符串,那么表中的值是弱值。 在你將表用作元表之后,你不應(yīng)該更改 __mode 字段的值。否則,這個(gè)元表控制的表的弱表行為將會(huì)不確定。 同步程序Lua支持同步程序,也稱為 半同步程序(semicoroutines) 或 協(xié)同多線程(collaborative multithreading)。Lua中的一個(gè)同步程序代表了一個(gè)獨(dú)立的執(zhí)行線程。然而,不像在多線程系統(tǒng)中的線程那樣,一個(gè)同步程序只有在調(diào)用了一個(gè)yield(產(chǎn)生結(jié)果)函數(shù)才能掛起它的執(zhí)行。 你可以調(diào)用 來(lái)創(chuàng)建一個(gè)同步程序。它唯一的一個(gè)參數(shù)是一個(gè)函數(shù),代表同步程序的主函數(shù)。create 函數(shù)僅僅建立一個(gè)新的同步程序然后返回一個(gè)它的句柄 (一個(gè)線程 thread 類型的對(duì)象);它不會(huì)啟動(dòng)該同步程序。 當(dāng)你第一次調(diào)用 ,將 返回的線程對(duì)象作為第一個(gè)參數(shù)傳遞給它,然后同步程序就啟動(dòng)了,從它的主函數(shù)的第一行開始。傳給 的額外的參數(shù)會(huì)作為同步程序主函數(shù)的參數(shù)傳遞過(guò)去。在同步程序開始執(zhí)行之后,它一直運(yùn)行到它結(jié)束或產(chǎn)生結(jié)果。 一個(gè)同步程序通過(guò)兩種方式結(jié)束它的運(yùn)行:正常情況下,當(dāng)它的主函數(shù)返回(顯式地或隱式的,在最后一個(gè)指令之后)時(shí)結(jié)束;異常地,如果有未保護(hù)的錯(cuò)誤。第一各情況下, 返回 true,加上同步程序主函數(shù)返回的其它值。在有錯(cuò)誤的情況下, 返回 false ,并附上錯(cuò)誤信息。 一個(gè)同步程序通過(guò)調(diào)用 來(lái)產(chǎn)生結(jié)果。當(dāng)一個(gè)同步程序產(chǎn)生結(jié)果,相應(yīng)的 就立刻返回,即使操作發(fā)生在嵌套函數(shù)調(diào)用中(也就是,不在主函數(shù)中,而在被主函數(shù)直接或間接調(diào)用的函數(shù)中)。在這種情況下, 也返回 true,以及傳給 。的所有參數(shù)。下次你繼續(xù)同一個(gè)同步程序時(shí),它會(huì)從它原來(lái)yield的地方繼續(xù)執(zhí)行,而 將返回給主程序傳給 的額外參數(shù)。 函數(shù)創(chuàng)建一個(gè)和 一樣的同步程序,但它不返回同步程序本身,而是返回一個(gè)繼續(xù)同步程序的函數(shù)(當(dāng)調(diào)用的時(shí)候)。傳遞給這個(gè)函數(shù)的參數(shù)作為繼續(xù)resume的額外參數(shù)。函數(shù)將返回resume返回的所有值,出除了第一個(gè)(布爾值的錯(cuò)誤代碼)。不像 ,這個(gè)函數(shù)不捕獲錯(cuò)誤;出現(xiàn)任何錯(cuò)誤都傳回給調(diào)用者。 請(qǐng)考慮以下例子: function foo1 (a) print(foo, a) return (2*a)endco = (function (a,b) print(cobody, a, b) local r = foo1(a+1) print(cobody, r) local r, s = (a+b, ab) print(cobody, r, s) return b, endend) a, b = (co, 1, 10)print(main, a, b)a, b, c = (co, r)print(main, a, b, c)a, b, c = (co, x, y)print(main, a, b, c)a, b = (co, x, y)print(main, a, b)當(dāng)你運(yùn)行它的時(shí)候,它會(huì)產(chǎn)生以下輸出結(jié)果: cobody 1 10foo 2main true 4cobody rmain true 11 9cobody x ymain true 10 endmain false cannot resume dead coroutine3 應(yīng)用程序接口這一節(jié)描述Lua中的C API,這是對(duì)于宿主程序可用的C函數(shù)集合,用以和Lua通訊。 即便每次我都使用“函數(shù)”這個(gè)詞,任何設(shè)施在API里面都可能被一個(gè)宏所替代。所有這些宏(macro)都只使用一次它的參數(shù)(除了第一個(gè)參數(shù)、這個(gè)每次總是一個(gè)Lua狀態(tài)),所以不會(huì)產(chǎn)生隱藏的副作用。 狀態(tài)Lua庫(kù)是可重入的(reentrant)的:它沒(méi)有全局變量。整個(gè)Lua解釋器的狀態(tài)(全局變量、棧、等等)儲(chǔ)存在一個(gè)動(dòng)態(tài)分配的 lua_State 結(jié)構(gòu)類型中。一個(gè)指向這個(gè)狀態(tài)的指針必須作為庫(kù)中每一個(gè)函數(shù)的第一個(gè)參數(shù),除了 lua_open 這個(gè)函數(shù)。該函數(shù)從最開始創(chuàng)建一個(gè)Lua狀態(tài)。 在調(diào)用任何API函數(shù)之前,你必須通過(guò)調(diào)用 lua_open 創(chuàng)建一個(gè)狀態(tài): lua_State *lua_open (void)。調(diào)用 lua_close 去釋放這個(gè)由 lua_open 創(chuàng)建的狀態(tài): void lua_close (lua_State *L)。這個(gè)函數(shù)銷毀所有被給予Lua狀態(tài)的對(duì)象(調(diào)用相應(yīng)的垃圾收集元方法)并且釋放那個(gè)狀態(tài)使用的所有動(dòng)態(tài)內(nèi)存。在個(gè)別的平臺(tái)上,?慊蛐聿恍枰饔謎飧齪?,因为当宿主辰{蚪崾氖焙蚧嶙勻壞氖頭潘械淖試礎(chǔ)A硪環(huán)矯媯な奔湓誦械某絳潁褚恍┦鼗そ袒蛘遅eb服務(wù)器,可能需要立即釋放那些不需要的狀態(tài)資源,以避免占用太多內(nèi)存。 堆棧和索引Lua使用一個(gè)來(lái)自于C語(yǔ)言的 虛擬棧(virtual stack) 傳遞值。棧里面的每一個(gè)元素都代表一個(gè)Lua值 (nil, number, string, etc.)。 只要Lua調(diào)用C語(yǔ)言函數(shù),這個(gè)所調(diào)用的函數(shù)將得到一個(gè)新的棧,這個(gè)棧將獨(dú)立于先前的棧以及那些仍然活躍的C函數(shù)的棧。這個(gè)棧最初包含了C函數(shù)的所有參數(shù),并且這也會(huì)存放C函數(shù)的返回值(見 )。 為了方便起見,大多數(shù)查詢操作的API不需要遵守一個(gè)嚴(yán)格的棧定義(注:即不需要遵循FILO)。他們可以使用 索引(index) 引用任何棧中元素:一個(gè)正數(shù)索引代表了棧中的絕對(duì)位置(從1開始);一個(gè)負(fù)數(shù)索引代表了從棧頂?shù)钠屏?。更特別的是,如果棧有 n 個(gè)元素,那么索引 1 代表第一個(gè)元素(這就是說(shuō),這個(gè)元素首先入棧)并且索引 n 代表了最后一個(gè)元素;索引 1 也代表了最后一個(gè)元素(也就是棧頂)并且索引 n 代表了第一個(gè)元素。我們說(shuō)一個(gè)索引存在于 1 和棧頂之間是有效的,換句話說(shuō),如果 1 = abs(index) = top。 在任何時(shí)間里,你可以調(diào)用 lua_gettop 得到棧頂元素的索引: int lua_gettop (lua_State *L)。因?yàn)樗饕龔?1 開始,lua_gettop 的結(jié)果等于棧中的元素?cái)?shù)量(如果是0就意味著棧為空)。 當(dāng)你與Lua API交互的時(shí)候,你有責(zé)任控制堆棧以避免溢出。這個(gè)函數(shù) int lua_checkstack (lua_State *L, int extra)。使棧的大小增長(zhǎng)為 top + extra 個(gè)元素;如果無(wú)法將棧增加到那個(gè)大小將返回false。這個(gè)函數(shù)從不對(duì)棧進(jìn)行收縮;如果棧已經(jīng)比新的大小更大,它將不產(chǎn)生任何作用那個(gè)。 只要Lua調(diào)用C 函數(shù),它必須至少保證 LUA_MINSTACK 這個(gè)棧中的位置是可用的。LUA_MINSTACK 定義在 中,它的值是 20,所以你不需要總擔(dān)心??臻g除非你的代碼通過(guò)循環(huán)將元素壓入棧。 大多數(shù)插敘函數(shù)接受指向有效??臻g的索引,那就是說(shuō),索引達(dá)到??臻g的最大值是你需要使用 lua_checkstack。這樣的索引稱為可接受索引(acceptable indices)。更正規(guī)的說(shuō)法,我們給出一個(gè)嚴(yán)格的定義如下: (index 0 amp。amp。 abs(index) = top) || (index 0 amp。amp。 index = stackspace)注意,0永遠(yuǎn)不是一個(gè)可接受索引。 除非另外說(shuō)明,任何函數(shù)接受有效索引可以被稱為是 偽索引(pseudoindices),這些索引代表一些Lua值可以被C 代碼訪問(wèn)但是卻不存在于棧中。假索引通常用于訪問(wèn)全局環(huán)境變量,注冊(cè)表,和一個(gè)C 函數(shù)的上值(見 )。 堆棧操作一下的API提供了基本的棧操作: void lua_settop (lua_State *L, int index)。 void lua_pushvalue (lua_State *L, int index)。 void lua_remove (lua_State *L, int index)。 void lua_insert (lua_State *L, int index)。 void lua_replace (lua_State *L, int index)。lua_settop 接受任何可接受的索引,或者0,并且將該索引設(shè)置為棧頂。如果新的棧頂比舊的更大,那么新元素被填上 nil 值。如果索引為 0,那么所有棧元素會(huì)被清除。在 里面定義了一個(gè)有用的宏 define lua_pop(L,n) lua_settop(L, (n)1)用以從棧中彈出 n 個(gè)元素。 lua_pushvalue 將一個(gè)索引指向的元素的拷貝壓入棧。 lua_remove 刪除指定位置的元素,將該元素上方的所有元素下移以填滿空缺。lua_insert 將棧頂元素移動(dòng)到指定位置,將該位置以上的元素上移。lua_replace 將棧頂元素移動(dòng)到指定位置而不移動(dòng)其他任何其他元素(因此替代了給定位置的元素的值)。所有這些函數(shù)只接受有效的索引。(你不能使用偽索引調(diào)用 lua_remove 或 lua_insert,因?yàn)樗麄儾淮項(xiàng)V械奈恢?。?舉個(gè)例子,如果棧開始于 10 20 30 40 50*(自底向上;`*180。 標(biāo)記了棧頂),那么: lua_pushvalue(L, 3) 10 20 30 40 50 30* lua_pushvalue(L, 1) 10 20 30 40 50 30 30* lua_remove(L, 3) 10 20 30 40 30 30* lua_remove(L, 6) 10 20 30 40 30* lua_insert(L, 1) 30 10 20 30 40* lua_insert(L, 1) 30 10 20 30 40* (no effect) lua_replace(L, 2) 30 40 20 30* lua_settop(L, 3) 30 40* lua_settop(L, 6) 30 40 nil nil nil nil* 堆棧查詢下面的函數(shù)可以用來(lái)檢測(cè)棧內(nèi)元素的類型: int lua_type (lua_State *L, int index)。 int lua_isnil (lua_State *L, int index)。 int lua_isboolean (lua_State *L, int index)。 int lua_isnumber (lua_State *L, int index)。 int lua_isstring (lua_State *L, int index)。 int lua_istable (lua_State *L, int index)。 int lua_isfunction (lua_State *L, int index)。 int lua_iscfunction (lua_State *L, int index)。 int lua_isuserdata (lua_State *L, int index)。 i
點(diǎn)擊復(fù)制文檔內(nèi)容
物理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1