正确lua简单的扩展,可以加速相关C++数据。

正确lua简单的扩展,可以加速相关C++数据。

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

很早的时候,我有一件事纠结。如果,我在这里C++打开界面脚本。使用C++其中一个目标,和。我的程序有很多不同的lua虚拟机。每个虚拟机与一个关联C++对象,它是多线程,那么如何快速应利用这个好时机lua_State针来定位到对象指针呢?

曾经我没有能力读懂lua的源代码,也能够说不知道关键部分怎样操作,我当时的做法。是利用临界区和std::map来解决这个问题的。非常明显这个方式的效率非常低非常低。

如今有能力读lua源代码了。当然有更有效的解决的方法了。由于在我们利用lua的过程中。lua_State这个结构指针是要贯穿全部用到lua的地方的,那么我就行对这个结构进行扩展,让它可以保存我的数据,仅仅须要保存一个指针就可以。

lua_State这个结构,定义在 lstate.h中   (lua.h中仅仅是作者为了不让用户可以主动訪问结构成员而定义的空结构指针。各种开源脚本引擎都是这样,为了安全性。大家懂的)

以lua5.2.3为例,该结构原始定义例如以下:

struct lua_State {
  CommonHeader;
  lu_byte status;
  StkId top;  /* first free slot in the stack */
  global_State *l_G;
  CallInfo *ci;  /* call info for current function */
  const Instruction *oldpc;  /* last pc traced */
  StkId stack_last;  /* last free slot in the stack */
  StkId stack;  /* stack base */
  int stacksize;
  unsigned short nny;  /* number of non-yieldable calls in stack */
  unsigned short nCcalls;  /* number of nested C calls */
  lu_byte hookmask;
  lu_byte allowhook;
  int basehookcount;
  int hookcount;
  lua_Hook hook;
  GCObject *openupval;  /* list of open upvalues in this stack */
  GCObject *gclist;
  struct lua_longjmp *errorJmp;  /* current error recover point */
  ptrdiff_t errfunc;  /* current error handling function (stack index) */
  CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */
};

那么对这个结构扩展之后例如以下:

struct lua_State {
  CommonHeader;
  lu_byte status;
  StkId top;  /* first free slot in the stack */
  global_State *l_G;
  CallInfo *ci;  /* call info for current function */
  const Instruction *oldpc;  /* last pc traced */
  StkId stack_last;  /* last free slot in the stack */
  StkId stack;  /* stack base */
  int stacksize;
  unsigned short nny;  /* number of non-yieldable calls in stack */
  unsigned short nCcalls;  /* number of nested C calls */
  lu_byte hookmask;
  lu_byte allowhook;
  int basehookcount;
  int hookcount;
  lua_Hook hook;
  GCObject *openupval;  /* list of open upvalues in this stack */
  GCObject *gclist;
  struct lua_longjmp *errorJmp;  /* current error recover point */
  ptrdiff_t errfunc;  /* current error handling function (stack index) */
  CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */
  int __mydata;//这里
};

//同一时候添加两个lua接口,能够将函数接口放到lapi.c中,声明放到lua.h中就可以,或者你是发烧追求极限效率不在乎很多其它的扩展和更新的朋友,那么你能够用硬编码定位,__mydata的偏移是0x70。

LUA_API void lua_setmydata(lua_State *L, int data){
 L->__mydata = data;
}

LUA_API int lua_getmydata(lua_State *L){
 return L->__mydata;
}

这样就万事具备了,又一次编译lua,试试结果怎样:

正确lua简单的扩展,可以加速相关C++数据。

更抽象一点的做法:

正确lua简单的扩展,可以加速相关C++数据。





使用硬编码进行定位:
正确lua简单的扩展,可以加速相关C++数据。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117401.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是SVN「建议收藏」

    什么是SVN「建议收藏」SVN:subversion子级版本(子级源代码版本控制管理软件)svn:全称Subversion,是代码版本管理软件,管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (r

    2022年8月4日
    3
  • Matlab axis用法「建议收藏」

    Matlab axis用法「建议收藏」转载地址:http://blog.sina.com.cn/s/blog_b26a90750101kxdx.htmlaxisoff;%去掉坐标轴axistight;%紧坐标轴axisequal;%等比坐标轴axis([-0.1,8.1,-1.1,1.1]);%坐标轴的显示范围%gca:gca,h=figure(…);set(gca,’XLim’…

    2022年6月11日
    49
  • Python自动化运维之路-01

    Python自动化运维之路-01python的主要应用python的擅长领域学python有没有前途?python的语言排名语言选择运维会了开发后可以干什么?python的最大优势就是什么都能做。课程概述毕业目标周五

    2022年7月4日
    20
  • Pycharm和Anaconda的python版本问题

    Pycharm和Anaconda的python版本问题问题描述:Pycharm需要导入tensorflow库,但现在的python版本为3.8,不支持导入。于是想办法在Anaconda新建python3.6环境,之后再用于Pycharm开发。1.anaconda创建新的python版本环境2.找到新建python3.6的文件位置,点击python36切换时会显示位置:3.pycharm里新建环境,以第二步的python3.6环境为基础环境:导包时可能会出现问题:zeroexitcode(2)这是因为pip版本问题,使用

    2022年8月28日
    0
  • Android游戏引擎选择[通俗易懂]

    Android游戏引擎选择[通俗易懂]Android游戏引擎选择今天在博客园看到一篇关于android游戏引擎的选择文章,特转载以便日后了解1.Ronkon(网站地址:http://www.ronkonandroid.com)如果不是想帮助作者解决一大堆兼容性问题的话还是不要使用这个引擎,我在上面浪费了1天半,就只是为了把实例程序跑起来。开始还以为是我水平菜,结果一堆人没跑起来,和我一样都是黑屏。虽然它文档做得好但我还是放弃了,本来Android平台兼容性就是老大难,在来个半吊子的引擎我可没本事搞定。2.AndEngine(网站地址:ht

    2022年9月18日
    0
  • javaweb-spring-53

    javaweb-spring-53

    2021年5月17日
    125

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号