当前位置: 首页 > news >正文

网站面试通知表格怎么做.net 网站开发教程

网站面试通知表格怎么做,.net 网站开发教程,网站建设 客户,模板建站网页转载自#xff1a; http://blog.codingnow.com/2013/01/binding_c_object_for_lua.html 如何绑定 C/C 对象到 Lua 里#xff1f;通常是创建一个 userdata #xff0c;存放 C/C 对象指针#xff0c;然后给 userdata 添加元表#xff0c;用 index 元方法映射 C/C 中的对象方…转载自 http://blog.codingnow.com/2013/01/binding_c_object_for_lua.html   如何绑定 C/C 对象到 Lua 里通常是创建一个 userdata 存放 C/C 对象指针然后给 userdata 添加元表用 index 元方法映射 C/C 中的对象方法。 也有另一个手段直接用 lightuserdata 保存 C/C 对象指针放到 Lua 中在 Lua 中创建一个 table 附加元表来来包装这个指针效果是类似的。区别在于对象生命期的管理方式有所不同。就这个问题几年前我写过一篇 blog 。 绑定 C/C 对象到 Lua 里的设计难点往往在这个正确的生命期管理上。因为 C/C 没有 GC 系统依赖手工管理资源而 Lua 则是利用 GC 做自动回收。这两者的差异容易导致在 Lua 中的对象对应的 C/C 对象已经销毁而 Lua 层不自知或 Lua 层中已无对象之引用而 C/C 层中却未能及时回收资源而造成内存泄露。 理清这个问题首先你要确定你打算以 Lua 为主干来维护对象的生命期还是以 C/C 层为主干 Lua 部分只是做一些对这些对象的行为控制。 我个人主张围绕 Lua 来开发C/C 只是写一些性能相关的库供 Lua 调用即框架层在 Lua 中。这样C/C 层只提供对象的创建和销毁函数不要用 C 指针做对象的相互引用。Lua 中对象被回收时销毁对应的 C 对象即可。 但是也有相当多的项目做不到这点。Lua 是在后期引入的之前 C/C 框架层中已做好了相当之复杂的对象管理。或者构架师不希望把脚本层过多的侵入引擎的设计。 那么下面给出另一个方案。 我们将包装进 Lua 的 C 对象称为 script object 那么只需要提供三个函数即可。 int script_pushobject(lua_State *L, void * object) {void **ud;if (luaL_newmetatable(L, script)) {// 在注册表中创建一个表存放所有的 object 指针到 userdata 的关系。// 这个表应该是一个 weak table 当 Lua 中不再存在对 C 对象的引用会删除对应的记录。lua_newtable(L);lua_pushliteral(L, kv);lua_setfield(L, -2, __mode);lua_setmetatable(L, -2);}lua_rawgetp(L,-1,object);if (lua_type(L,-1)LUA_TUSERDATA) {ud (void **)lua_touserdata(L,-1);if (*ud object) {lua_replace(L, -2);return 0;}// C 对象指针被释放后有可能地址被重用。// 这个时候可能取到曾经保存起来的 userdata 里面的指针必然为空。assert(*ud NULL);}ud (void **)lua_newuserdata(L, sizeof(void*));*ud object;lua_pushvalue(L, -1);lua_rawsetp(L, -4, object);lua_replace(L, -3);lua_pop(L,1);return 1; }这个函数把一个 C 对象指针置入对应的 userdata 如果是第一次 push 则创建出新的 userdata 否则复用曾经创建过的。 void * script_toobject(lua_State *L, int index) {void **ud (void **)lua_touserdata(L,index);if (ud NULL)return NULL;// 如果 object 已在 C 代码中销毁*ud 为 NULL 。return *ud; }这个函数把 index 处的 userdata 转换为一个 C 对象。如果对象已经销毁则返回 NULL 指针。 在给这个对象绑定 C 方法时应注意在 toobject 调用后全部对指针做检查空指针应该被正确处理。 void script_deleteobject(lua_State *L, void *object) {luaL_getmetatable(L, script);if (lua_istable(L,-1)) {lua_rawgetp(L, -1, object);if (lua_type(L,-1) LUA_TUSERDATA) {void **ud (void **)lua_touserdata(L,-1);// 这个 assert 防止 deleteobject 被重复调用。assert(*ud object);// 销毁一个被 Lua 引用住的对象只需要把 *ud 置为 NULL 。*ud NULL;}lua_pop(L,2);} else {// 有可能从未调用过 pushobject 此时注册表中 script 项尚未建立。lua_pop(L,1);} }这个函数会解除 C 对象在 Lua 中的引用后续在 Lua 中对这个对象的访问都将得到 NULL 指针。 这些代码是在我写这篇 blog 的同时随手写的并未经过严格测试。它们也有许多改进空间比如给 C 对象加入类型对 userdata 做更严格的检查等等。
http://www.sadfv.cn/news/128634/

相关文章:

  • 怎么建立网站推广wordpress 显示视频播放
  • 怎么学php网站开发营销策略有哪几种
  • 百度网站首页一个上线的网站需要怎么做
  • 网站开发自我介绍代码建昌县城乡规划建设局网站
  • 404错误页面放在网站的哪里电子商务网站优化
  • 网页游戏手机seo排名软件
  • 能利用双股铜芯电话线做网站吗河南城乡建设网站
  • 用asp.net 做网站中国制造网外贸平台怎么注册
  • 平面设计创意网站建设酒店网站建设策划书
  • 网站死链怎么办中国建筑校园招聘
  • 南宁市优化网站公司外链提高网站权重
  • 新乡手机网站建设电话软件搭建公司
  • 建wap网站八爪鱼采集新闻到wordpress
  • 郑州一网网站建设工业和信息化部证书含金量
  • 有哪些电商网站网店美工招聘
  • 3d网站建设音乐网站建设价格6
  • 商务网站建设的一般流程山东省建设公司网站
  • 怎么做关于花的网站化妆所有步骤
  • 南通网站推广排名wordpress调起淘宝app
  • 什么软件能创建网站专业建设 验收 网站
  • 做网站竞价还需要推广公司简历模板免费可编辑
  • 网站前端开发流程就业前景好的专业排名
  • 网站调用数据库崇州 网站建设 有限公司
  • 知名商城网站建设价格网站建设与安全管理
  • 临沂企业网站开发官网网站申请备案流程
  • 福建网站建设有限公司上海seo怎么优化
  • seo站长工具 论坛苏州网页制作人才招聘
  • 个人网站免费制作平台网站建设代码怎么导入图片
  • node怎么做网站广东网站设计工具
  • 建个网站费用多少网站建设与管理相关工作岗位