我怎样才能成功在Lua中使用Loki的小对象分配器?
2014-3-21 2:4:28
收藏:0
阅读:380
评论:2
我在这里读到有人推荐使用Loki的Small Object Allocator for Lua来帮助改善分配性能。我阅读了“现代C++设计”中的部分内容,我认为我已经了解了如何使用Loki进行此操作,但不包括不使用“SmallObject”-Lua只想要原始内存,因此我首先尝试直接使用“SmallObjAllocator”。
似乎分配正在工作,但是一旦尝试加载脚本(使用lua_load()
和自定义读取器或使用luaL_loadfile()
直接读取文件时),一切都会完全失败。
这是我使用MySmallAllocator类的实现:
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()
的调用中返回:
for i=1,100 do
local test = { }
end
出了什么问题,我该如何诊断它,以及如何修复它?
原文链接 https://stackoverflow.com/questions/1100992
点赞
stackoverflow用户88888888
好主意!我真的不理解realloc()的作用,所以你让我走上了正确的道路。我将重新分配部分替换为以下代码,现在一切都可以工作,但我的性能实际上比以前使用的HeapAlloc/HeapReAlloc/HeapFree要差一点。
void* replacementPtr = alloc_.Allocate( nsize, true );
memcpy( replacementPtr, ptr, min(osize, nsize) );
alloc_.Deallocate( ptr );
ptr = replacementPtr;
我怀疑一个问题是Loki在每个Chunk以及当大小> GetMaxObjectSize()时使用malloc/free…
2009-07-09 18:50:57
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我关注的问题是您的自定义分配器需要像 C 的
realloc()
函数一样运作。当osize != nsize
且二者都不为零时,这一点至关重要。在这种情况下,realloc()
的关键特性在于保留旧块前min(osize,nsize)
个字节的值作为新块的开头。您的代码如下:
else { alloc_.Deallocate( ptr ); ptr = alloc_.Allocate( nsize, false ); }
这将放弃旧分配中的所有内容。
这在 lua_Alloc 的文档中已经明确规定: