ここのどこかで、Loki の Small Object Allocator for Lua を使用して割り当てのパフォーマンスを向上させることを誰かが推奨している記事を読んだことがあります。「Modern C++ Design」のセクションを読みましたが、Loki を使用しないことを除いて、これに Loki を使用することについて十分に理解していると思いますSmallObject
。直接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" );
Global.lua に単純なfor
ループがある場合、システムは次の呼び出しから決して戻りませんluaL_loaloadfile()
:
i=1,100 の場合 ローカル テスト = { } 終わり
何が問題なのか、これをどのように診断し、どのように修正すればよいですか?