Я работаю с lua C api для запуска скриптов, которые взаимодействуют с нативными предложениями.Я использую MOC Qt для получения информации о типе времени выполнения.До сих пор я реализовал создание, удаление и индексацию всех классов, с которыми я хочу общаться с lua.
Вот пример сценария того, что я могу сделать сейчас:
myObject = MyClass.new() --creates new userdata
otherObject = OtherClass.new() --creates new userdata
myObject:functionForOthers(otherObject) --method that takes userdata as argument
В этом сценарии otherObject
создается и остается в стеке.Затем он проходит через functionForOthers()
, который принимает OtherClass
объекты в качестве аргумента.
Но что, если я не хочу, чтобы otherObject
был помещен в стек?Что, если я хотел, чтобы это была анонимная переменная, существующая только в области вызова функции?
myObject = MyClass.new()
myObject:functionForOthers(OtherClass.new())
Это все еще работает, но экземпляр OtherObject
создается, но никогда не назначаетсяпеременная оставляет ее в стеке недоступной до тех пор, пока не закончится область.Это не вызывает каких-либо прямых проблем, но беспокоит часть меня, которая эффективно использует память.
У меня есть много нативного кода, обрабатывающего бэкэнд этих операций, но суть в том, что new
это поле глобальных таблиц MyClass
и OtherClass
, которое указывает на встроенную функцию CreateObject.Оттуда экземпляр класса создается и сохраняется в пользовательских данных после вызова lua_newuserdata()
В вызове functionForOthers()
используется метаметод __index
, который указывает на встроенную функцию IndexObject, которая вызывает методесли он существует.
Каков основной подход к реализации анонимных переменных пользовательских данных?Я по-прежнему хочу, чтобы оба сценария были корректными, я просто хочу, чтобы объект OtherClass
второго сценария оставался в области действия до завершения вызова функции.