как я очищаю свою стопку состояния lua?

Я использую lua C-API для чтения в данных конфигурации, который хранится в lua файле.

У меня есть миленькая таблица в файле, и я записал C-функцию запроса, которая анализирует определенное поле в таблице. (yay это работает!)

Это работает путем вызова нескольких из этих видов функций много раз:

... 
lua_getglobal (...); 
lua_pushinteger (...); 
lua_gettable (...); 
lua_pushstring (...); 
lua_gettable (...); 
lua_lua_getfield (...);
...

Вы получаете идею.

После того, как я буду сделан, запрашивая мои данные как это, я должен очистить стек?

5
задан RBerteig 23 February 2010 в 20:41
поделиться

3 ответа

Пока ваш стек не растет неограниченно, все будет в порядке. Когда вы возвращаете целочисленные N из C API в Lua, происходят две вещи:

  • Движок Lua берет верхние N значения из стека и рассматривает их как результат вызова.

  • Движок Lua деаллоцирует (и повторно использует) все остальное в стеке.

Дэвид Сейлер упоминает возможность того, что ваш C-код может быть вызван из другого C-кода, а не из движка Lua. Это продвинутая техника, и если вы задаете этот вопрос, то вряд ли вам придется беспокоиться об этом конкретном вопросе. (Но с точки зрения Lua это происходит одинаково - когда весь код C завершает выполнение, он должен вернуть целое число, и Lua снимает столько значений со стека, а затем деаллоцирует оставшееся.)

Если вы используете слишком много слотов стека, ваша программа остановится с вменяемым и разумным сообщением об ошибке (как я знаю по опыту).

6
ответ дан 14 December 2019 в 04:37
поделиться

Это зависит от того.

Если ваша C-функция вызывается из Lua, то значения, которые вы оставляете позади, будут значениями, которые ваша C-функция возвращает в Lua. Если ваша C-функция вызывается другой C-функцией, которая использует стек Lua, то эти значения все еще будут в стеке, и вы можете делать с ними что угодно или ничего.

Но если после вызова вашей C-функции вы полностью закончили работу с Lua, а из вашего вопроса следует, что так оно и есть, то вам не нужно очищать стек Lua. Просто закройте контекст Lua, и он очистит ваш стек за вас.

1
ответ дан 14 December 2019 в 04:37
поделиться

дополнительно, вместо использования pushstring или pushinteger, за которыми следует таблица, используйте lua_getfield и lua_rawgeti соответственно (сырые данные не будут вызывать метаметоды, если вы этого захотите ...)

1
ответ дан 14 December 2019 в 04:37
поделиться