2010-01-20 5 views
5

Actualmente estoy construyendo mi propio guión VM clase gerente en C++, no tengo problemas con cualquiera de los lua & lua C o C cosas ++, pero la sección que me confunde es: cuándo utilizar lua_pop y cuándo usar lua_remove.lua_pop vs lua_remove

Por lo que entiendo, lua_pop es eliminar varios valores (en la pila) de arriba hacia abajo, eliminando datos que ya no se necesita, donde como lua_remove es para la eliminación de un único valor a partir de cualquier índice arbitrario, pila válido (básicamente lo que dice el manual de lua para ambos: P).

pero me he dado cuenta de segmentos de código ceratin esparcidos alrededor de la web que se entremezclan y lua_poplua_remove, pero cuando traté de usar en lugar de lua_poplua_remove donde la llamada acaba de quitar el elemento de la pila superior, me encontré con problemas, por lo que lo haría sea ​​posible obtener un ejemplo definitiva o explicación sobre cómo y cuándo utilizar estas dos funciones correctamente, así como la velocidad reletive & eficiencia de estos dos (asumo lua_pop es más rápido que lua_remove, que es una de las razones por las que quiero lua_pop utilizar tanto como sea posible, además de la codificación 'código correcto')

gracias :)

+2

No se preocupe por la eficiencia. "codificación 'código correcto'" es * * manera más importante. –

+0

Bueno, me gusta corregirlo, para que luego pueda optimizar cuando se hace – Necrolis

+0

optimizar solo después de que su código funcione y la optimización sea clara y mensurable. No tiene sentido tener más complejidad y mayores costos de mantenimiento solo para presumir. –

Respuesta

8

Un ejemplo típico de lua_remove está accediendo a las tablas. Fragmentos del 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 empuja t [x] en la pila. Ya no necesitas t, entonces lo quitas.

Un ejemplo típico de lua_pop se iterar sobre una mesa.

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); 
} 

Después de que haya terminado con una única iteración, es necesario tener la llave en la parte superior de la pila, por lo que sabe lo que lua_next par clave/valor que viene a continuación. Debes eliminar el valor, que está en la parte superior de la pila.

No es un ejemplo definitivo. En Lua haces lo que sea que funcione para ti. Siempre tenga en cuenta lo que está en su pila lua_State, y todo irá bien.

+0

gracias, volveré a mirar la sección de tablas para ver si eso ayuda :) – Necrolis

2

son muy diferentes. lua_pop siempre se elimina de la parte superior de la pila. lua_remove eliminará un valor de anywere en la pila. Si el valor que desea eliminar de la pila no está en la parte superior, no puede usar lua_pop.

p. Ej.

[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

Los siguientes fragmentos de código C son totalmente equivalentes:

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

Así son los siguientes:

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