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

很早的时候,我有一件事纠结。如果,我在这里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,试试结果怎样:

更抽象一点的做法:

使用硬编码进行定位:



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR25vcnRo/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

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

时间: 2024-10-03 23:15:57

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

cpp文件调用CUDA .cu文件实现显卡加速相关编程

本篇文章谈的是cpp文件如何调用CUDA的.cu文件实现显卡加速的相关编程.当然,这是在默认已经配置好CUDA的情况下进行的,如果对于如何配置CUDA还有疑问可以看之前写的这一篇文章.另外,现在CUDA已经放出了支持VS2013的6.5版本,所以还是建议用最新的,毕竟VS2013好用太多,配置起来也没什么区别.关于那篇配置文章,并没有解决CUDA相关函数偶有错误提示的问题,虽然对于编译没有影响,但是对于有强迫症的人来说还是比较纠结的,本人研究过后会更新,望周知. 关于如何通过cpp文件调用CUD

《转载》 cpp文件调用CUDA .cu文件实现显卡加速相关编程

转自:   http://m.blog.csdn.net/blog/oHanTanYanYing/39855829 本篇文章谈的是cpp文件如何调用CUDA的.cu文件实现显卡加速的相关编程.当然,这是在默认已经配置好CUDA的情况下进行的,如果对于如何配置CUDA还有疑问可以看之前写的这一篇文章.另外,现在CUDA已经放出了支持VS2013的6.5版本,所以还是建议用最新的,毕竟VS2013好用太多,配置起来也没什么区别.关于那篇配置文章,并没有解决CUDA相关函数偶有错误提示的问题,虽然对于

lua简单地异或加密文件

用lua简单地异或加密文件,注意解密的key是加密key的倒序: 1 require 'bit' 2 3 local encode = function(inpath, outpath, key) 4 local inf = assert(io.open(inpath, "rb")) 5 local outf = assert(io.open(outpath, "wb")) 6 7 if (type(key) ~= "string") or (s

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

ExtJs--14--Ext.typeOf() 与 javascript中的typeof很相似,只是在类型上进行了一点简单的扩展,其实可以直接看源代码就可以看得懂的

Ext.typeOf() // Ext.typeOf() 与 javascript中的typeof很相似,只是在类型上进行了一点简单的扩展,其实可以直接看源代码就可以看得懂的 // typeOf: function(value) { // var type, // typeToString; // // if (value === null) { // return 'null'; // } // // type = typeof value; // // if (type === 'undef

PHP练手:日历(代码简单,扩展容易)

抽空写了个日历程序,只注重功能和实现的思路,所以代码和功能都比较简单,但是理解和扩展也比较容易. show()函数用来显示日历,你可以修改show()函数,通过传值的方式来实现显示不同的年月. <?php class Calendar{ public $weekarray = array('星期日','星期一','星期二','星期三','星期四','星期五','星期六'); public $firstDay = '';//当月第一天 public $firstNum = '';//返回当月第一天

Asp.net 无法访问请求的页面,因为该页的相关配置数据无效。

原文 http://home.bdqn.cn/thread-13632-1-1.html HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 详细的错误信息就是:不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的allowOverrid

IIS 无法访问请求的页面,因为该页的相关配置数据无效。

IS 无法访问请求的页面,因为该页的相关配置数据无效. 配置错误   This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag

JSP简单练习-用Servlet获取表单数据

// javaBean代码 package servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class AcceptUserRegist extends HttpServlet { public String codeToString(String str) // 处理中文字符串的函数 { String s=str; try { byte tempB[]=s.getByt