Я читал где-то здесь, где кто-то рекомендовал использовать Loki Small Object Allocator для Lua, чтобы улучшить производительность выделения. Я прочитал раздел «Современный дизайн C ++» и думаю, что достаточно хорошо разбираюсь в использовании Loki для этого, за исключением того, что не использую SmallObject
- Lua просто хочет использовать сырую память, поэтому я сделал первый используйте SmallObjAllocator
прямо.
Распределения выглядят так, как будто они работают, но все полностью терпит неудачу, когда я пытался загрузить скрипт (либо используя lua_load()
с моим собственным пользовательским считывателем, либо luaL_loadfile()
для непосредственного чтения файла).
Вот моя реализация класса SmallObjAllocator
:
class MySmallAllocator : public Loki::SmallObjAllocator
{
public:
MySmallAllocator( std::size_t pageSize,
std::size_t maxObjectSize,
std::size_t objectAlignSize ) : Loki::SmallObjAllocator( pageSize, maxObjectSize, objectAlignSize )
{
}
virtual ~MySmallAllocator()
{
}
};
static MySmallAllocator alloc_(4096,64,4);
И когда я создаю состояние Lua, я даю ему функцию выделения, которая использует этот новый распределитель:
masterState_ = lua_newstate(customAlloc_, &heap_);
void* customAlloc_( void* ud, void* ptr, size_t osize, size_t nsize )
{
// If the new size is zero, we're destroying a block
if (nsize == 0)
{
alloc_.Deallocate( ptr );
ptr = NULL;
}
// If the original size is zero, then we're creating one
else if (0 != nsize && 0 == osize)
{
ptr = alloc_.Allocate( nsize, false );
}
else
{
alloc_.Deallocate( ptr );
ptr = alloc_.Allocate( nsize, false );
}
return ptr;
}
И вот я иду, чтобы загрузить файл:
int result = luaL_loadfile( masterState_, "Global.lua" );
Если у меня есть простой цикл for
в Global.lua, система никогда не вернется из вызова на luaL_loaloadfile()
:
for i=1,100 do
local test = { }
end
Что не так, как мне это диагностировать и как это исправить?