广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么在Lua中管理C对象
  • 211
分享到

怎么在Lua中管理C对象

2024-04-02 19:04:59 211人浏览 泡泡鱼
摘要

本篇内容主要讲解“怎么在lua中管理C对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Lua中管理C对象”吧!今天同事在设计引擎的脚本接口时遇到一个问题

本篇内容主要讲解“怎么在lua中管理C对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Lua中管理C对象”吧!

今天同事在设计引擎的脚本接口时遇到一个问题:需要把 C 对象指针放到 Lua 中,允许 Lua  保存这个指针,并传递给其它模块。 这是给 Lua 写 C 扩展时常见的问题,撇开如何如何将对象的方法导入 Lua  这个更复杂的问题不谈,我主要想说说 C 对象的生命期管理的问题。 一开始的设计是把对象的销毁方法也导入 Lua  ,由脚本程序员手工管理。这是很明显的 C 程序员的思路:谁构造谁释放。但在这里是不合适的,不符合带 GC 机制语言的习惯。 ... Click  to expand...

今天同事在设计引擎的脚本接口时遇到一个问题:需要把 C 对象指针放到 Lua 中,允许 Lua 保存这个指针,并传递给其它模块。

这是给 Lua 写 C 扩展时常见的问题,撇开如何如何将对象的方法导入 Lua 这个更复杂的问题不谈,我主要想说说 C 对象的生命期管理的问题。

一开始的设计是把对象的销毁方法也导入 Lua ,由脚本程序员手工管理。这是很明显的 C 程序员的思路:谁构造谁释放。但在这里是不合适的,不符合带 gc 机制语言的习惯。

我们当然希望脚本更为健壮,不需要考虑对象释放的问题。所以晚上我想了一下,修改了一下这部分的实现。

从效率方面着手,这个问题分两种情况:

***种情况很简单,C 对象可以被传入 Lua 状态机后,逻辑上可以确保它的指针一定一直有效,程序直到 Lua 状态机本身关闭后,才会删除对象。这种情况我们只需要把 C 对象指针以 lightuserdata 的形式压入堆栈即可。

第二种情况就是,C 对象由脚本创建或获得。在没有地方对其引用之后,对象则应该被删除以释放其占用的资源。这种情况,我们应该使用 fulluserdata ,为其注册 gc 元方法。

不过问题复杂在,引用 C 对象的可以是脚本也可以在 C 代码中。脚本中对 userdata 的引用 lua 状态机会自行解决,但 lua 的 gc 过程并不能直接知道 C 中是否对对象还有引用,这就是我们需要做的工作了。

python 的 C 接口提供了相关的函数,可以在 C 界面上对 PyObject 加减引用。但是 lua 的 gc 是基于根扫描的,状态机中并没有引用计数。很自然的,lua 就没有类似的 C 接口了。

我的解决方法是,在 lua 注册表中创建一个弱表(value 是弱的,而 key 是强的),把 C 对象指针和对应的  fulluserdata 以及它在 C 中的引用数量记入这个表里。然后提供一对 api 对引用计数增减。当引用计数为 0  时,清除关于计数的表项。最终可利用 gc 回收掉已无引用的 C 对象。

详细的程序可以参考我的 wiki 上贴的代码。

这里补充几点说明:

所有对象的 gc 元方法是共享的,而不是每次创建 fulluserdata  创建一个新的元表。这是一个简单的优化,可以节省不少的内存。方便起见,这个元表也放在那个弱表内。注意:在 Lua 中,每次压入一个  CFucntion 都会重新分配内存创建一个新对象。所以应该尽可能的共用。

每次从 C 对象指针生成 fulluserdata 时,都会去检查以前是否生成过。这样才能使引用计数统一计算。

代码随手写的,并没有经过严格的测试,如果谁想拿去用可自便,但发现 bug 请通知我修改过来。

原文链接:Http://tech.it168.com/j/2008-02-17/200802171052983.shtml

到此,相信大家对“怎么在Lua中管理C对象”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么在Lua中管理C对象

本文链接: https://www.lsjlt.com/news/75421.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Lua中管理C对象
    本篇内容主要讲解“怎么在Lua中管理C对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Lua中管理C对象”吧!今天同事在设计引擎的脚本接口时遇到一个问题...
    99+
    2022-10-19
  • C#中怎么引用托管对象
    C#中怎么引用托管对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#引用托管对象例如下面:FileStream fs = ne...
    99+
    2023-06-17
  • JAVA中内存块对象的Lua怎么封装
    本篇内容主要讲解“JAVA中内存块对象的Lua怎么封装”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA中内存块对象的Lua怎么封装”吧!对于 3d 库来说,API 涉及大量的内存块的操作。...
    99+
    2023-06-04
  • 怎么理解C++中的类和对象
    怎么理解C++中的类和对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。c++类的由来(或者说为什么要增加类):我们知道c语言是面向过程的语言,c++是即面向过...
    99+
    2023-06-25
  • C#中怎么通过调用Windows API托管对象
    本篇文章为大家展示了C#中怎么通过调用Windows API托管对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#中调用Windows API实例下面: FileStream ...
    99+
    2023-06-18
  • 怎么用C++面向对象实现图书管理系统
    本文小编为大家详细介绍“怎么用C++面向对象实现图书管理系统”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用C++面向对象实现图书管理系统”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.题目:【1】:工作...
    99+
    2023-06-29
  • C#中DirectoryEntry对象怎么使用
    DirectoryEntry对象在C#中用于操作和管理目录服务(也称为Active Directory)中的目录项。下面是一些常用的...
    99+
    2023-09-15
    C#
  • C#中怎么调用Excel对象
    本篇文章给大家分享的是有关C#中怎么调用Excel对象,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#调用Excel对象微软的Excel对象模型包括了128个不同的对象,从矩...
    99+
    2023-06-17
  • C#中怎么创建String对象
    本文小编为大家详细介绍“C#中怎么创建String对象”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中怎么创建String对象”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。创建 String 对象您可以使用...
    99+
    2023-06-17
  • C#中怎么查看对象模型
    C#中怎么查看对象模型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#语言有很多值得学习的地方,这里我们主要介绍C#查看Excel对象模型,包括介绍Range对象的Find(...
    99+
    2023-06-17
  • C++中怎么实现对象复制
    今天就跟大家聊聊有关C++中怎么实现对象复制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C++对象复制代码示例:class Table{  Name&...
    99+
    2023-06-17
  • 怎么在C++链表中链入不同类型对象
    这篇文章主要介绍“怎么在C++链表中链入不同类型对象”,在日常操作中,相信很多人在怎么在C++链表中链入不同类型对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在C++链表中链入不同类型对象”的疑惑有所...
    99+
    2023-06-17
  • Git管理:学会在ASP中使用API对象!
    在ASP中,API对象是一个非常有用的工具,可以帮助开发者更好地管理Git仓库。本文将详细介绍如何使用API对象来管理Git仓库,并附带演示代码。 安装Git 在使用API对象之前,需要先安装Git。可以从Git官网(https://...
    99+
    2023-11-03
    api 对象 git
  • C#中怎么实现对象初始化
    本篇文章给大家分享的是有关C#中怎么实现对象初始化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#对象初始化器 (Object Initializers) :.NET2.0框...
    99+
    2023-06-17
  • C++中怎么统计对象的个数
    这篇文章给大家介绍C++中怎么统计对象的个数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。利用auto_ptr统计C++的对象个数,要注意一定要把构造函数声明为私有,C++统计对象个数代码如下:class A...
    99+
    2023-06-17
  • C#中怎么创建一个DataSet对象
    C#中怎么创建一个DataSet对象,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 启动 Microsoft Visual Studio .NET。在文件菜单上,单击新建,...
    99+
    2023-06-17
  • 怎么在C++中计算结构体与对象的大小
    今天就跟大家聊聊有关怎么在C++中计算结构体与对象的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发...
    99+
    2023-06-15
  • 如何在ASP中使用API对象来管理Git?
    在ASP中使用API对象管理Git是一种非常方便的方法,让我们能够更加轻松地管理Git仓库。在本文中,我们将会介绍如何在ASP中使用API对象来管理Git,并且会穿插一些演示代码。 在开始之前,我们需要先了解一下Git和ASP的一些基本知识...
    99+
    2023-11-03
    api 对象 git
  • 如何在 Windows 系统中管理 Go 文件对象?
    在 Windows 系统中,管理 Go 文件对象是一个常见的任务。无论是在开发过程中还是在运行时,管理文件对象的能力都是必不可少的。在本文中,我们将介绍如何在 Windows 系统中管理 Go 文件对象。 什么是文件对象? 在 Go 中,文...
    99+
    2023-10-29
    文件 windows 对象
  • C++11怎么用string对象处理文件名
    这篇文章主要介绍“C++11怎么用string对象处理文件名”,在日常操作中,相信很多人在C++11怎么用string对象处理文件名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11怎么用string对...
    99+
    2023-06-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作