2010-01-20 18 views
5

我目前正在建設自己的腳本,虛擬機管理器類在C++中,我有任何的LUA & LUA C或C++的東西沒有問題,但一節讓我困惑的是:當使用lua_pop和何時使用lua_remove調用lua_pop VS lua_remove

從我明白,lua_pop是從上而下除去(在棧)的多個值,消除了不再需要的數據,其中作爲lua_remove是用於從任何任意的,有效的棧索引中刪除單個值(基本上lua手冊對兩者都說了什麼:P)。

,但我注意到的是散落混雜lua_poplua_remove各地的網絡代碼ceratin段,但是當我試圖用lua_pop代替lua_remove在呼叫只是刪除棧頂元素,我遇到了問題,所以會有可能得到一個明確的例子或解釋如何以及何時正確使用這兩個功能,以及這兩個相關的效率(我假設lua_poplua_remove更快,這是我想要的原因之一儘量使用lua_pop,除了編碼'正確的編碼')

謝謝:)

+2

不要擔心效率。 「編碼」正確的編碼「」 *方式*更重要。 – 2010-01-20 16:40:36

+0

好吧,我喜歡弄清它的正確性,以便在完成 – Necrolis 2010-01-21 06:18:32

+0

優化後才能優化,只有在您的代碼正常工作並且需要明確且可衡量地進行優化之後才能進行優化。爲了炫耀,更復雜和更高的維護成本毫無意義。 – 2010-01-21 06:23:19

回答

8

lua_remove的典型示例是訪問表。片段從Lua reference manual

lua_getfield(L, LUA_GLOBALSINDEX, "t"); /* table to be indexed */ 
lua_getfield(L, -1, "x");  /* push result of t.x (2nd arg) */ 
lua_remove(L, -2);     /* remove 't' from the stack */ 

lua_getfield在堆棧上推送t [x]。你不再需要t,所以你刪除它。

lua_pop的一個典型示例在表上迭代。

lua_pushnil(L); /* first key */ 
while (lua_next(L, t) != 0) { 
    /* uses 'key' (at index -2) and 'value' (at index -1) */ 
    /* do whatever you like with the key and the value */ 

    lua_pop(L, 1); 
} 

您使用的是單次迭代完成後,需要對堆棧頂部的按鍵,讓lua_next知道哪個鍵/值對隨之而來的。您需要刪除位於堆棧頂部的值。

這不是一個明確的例子。在Lua你可以爲你做任何事情。一定要記住你的lua_State棧上有什麼,你會沒事的。

+0

謝謝我會再次查看錶格部分,看看是否有幫助:) – Necrolis 2010-01-21 06:19:32

2

他們是非常不同的。 lua_pop總是從堆棧頂部移除。 lua_remove將從堆棧中的任何內容中刪除值。如果您希望從堆棧中刪除的值不在頂部,則不能使用lua_pop

例如

[5][4][3][2][1] 
after lua_pop(L, 3); would be 
[X][X][X][2][1] 



[5][4][3][2][1] 
after lua_remove(L, 3); would be 
[X][5][4][2][1] 
2

的C代碼以下作品是完全等價的:

lua_pop(L, 1); // same as: 
lua_remove(L, -1); 

所以有這些:

lua_pop(L, n); // same as: 
lua_settop(L, lua_gettop(L)-n);