修改栈值但保持栈平衡的做法是否可行?

众所周知保持栈平衡是很好的编程实践。然而,我想知道的是,在 Lua 脚本中调用的 C 函数中,我是否允许修改栈值?考虑以下代码:

int myfunc(lua_State *L)
{
    int arg1 = luaL_checkinteger(L, 1);
    int arg2 = luaL_checkinteger(L, 2);

    // 弹出第二个参数
    lua_pop(L, 1);

    // 创建一个新的 table 作为返回值
    lua_newtable(L);

    ...复杂的操作...

    // 恢复第二个参数, 但将其设置为 nil 以方便使用
    lua_pushnil(L);
    lua_insert(L, 2);

    // 返回我们的 table
    return 1;
}

上面的代码将第二个参数替换为 nil。这样做是允许的吗?或者我是否必须恢复原始值,即我是否必须这样做:

lua_pushinteger(L, arg2);

而不是:

lua_pushnil(L);

?或者,只要 myfunc 返回时栈保持平衡,这根本不重要吗?

点赞
用户107090
用户107090
**栈中的值是被调用的 C 函数的属性。你可以随意使用它们。唯一对外的影响是由函数返回的值。**

从 Lua 调用的 C 函数不需要保持栈平衡,也就是说,它并不需要与进入时具有相同内容或相同数量的项。 
2017-11-27 17:31:55