tolua++的一些想法

2023-12-25 12:38
文章标签 tolua 想法

本文主要是介绍tolua++的一些想法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.runoob.com/lua/lua-metatables.html


tolua 和 tolua++的区别:tolua++是tolu a的扩展,他实现了一些toua没有的特性,比如多重继承,std::string等,新版的tolua也很老了,大概是2012年更新的吧,新版的tolua支持了类模版。tolu a++更是多年不更新,大概是2009年左右更新的吧,只支持lua5.1,现在lua都到5.3了。关于lua5.1 和lua5.3的区别,我一定要找个时间好好写写,所在的项目还是5.1,tolua++是最新的也就是1.0.93.。。。。
tolua++实现了C++和Lua代码的融合,让C++的代码可以在Lua中被调用。他就是一个工具,把C++代码转换成lu a可以调用的代码。
tolua++利用.pkg文件导出需要的类型,函数,对象。
tolua++并不完整的解析C++代码,只是解析一些用来描述暴露给lua功能的声明。
tolua++将C++的基本类型映射到Lua的基本类型。(C++中的char,int,float,double转化成LUA的NUMBER,cha r*和string转换成lua 的string,class,struct等转换成userdata),对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c函数为值的表项。在metatable的__index和__newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。
tolua++之所以能实现C++的函数转换成lua的函数,是因为Lua中存在metatable(http://www.runoob.com/lua/lua-metatables.html)
.pkg文件
.pkg文件只列出所有暴露给lua使用的常数,变量,函数,类和方法。
.pkg文件可以包括常规头文件(其他的.pkg文件、C/C++头文件、Lua文件)。
e.g:$pfile “Framework/GameCommon.pkg”
$#include “3rdplatform/ChannelManager.h”
(文件类中的private,protected部分tolua++是不可以访问的。)
$lfile “example.lua”
tolua++的一些使用细节:
(1)基本数据类型:tolua++自动将C/C++的基本类型映射到lua的基本类型;
预处理unsigned、static、 short和const等修饰符, 所谓的预处理也就是给忽略掉了,在生成的.cpp目标文件中,.get方法还是有这些修饰符的,到.set中就吞掉了。项目用的是CEGUI,其中存在着CEGUI::String这个类型,tolua++转换到.pkg文件生成的.cpp文件的时候就已经是string类型了,因为CEGUI::String中有构造函数实现了转换,可以看看CEGUI的代码,CEGUI还是使用的拓展的tolua++,支持异常处理,新增加了tolua_throws这个函数,还是挺厉害的呢。
(2)用户自定义的数据类型都是LUA中有userdata嘛,就可以实现了
(3)typedef 
(4)常量:支持enum,define 在写代码时还挺常用的
(5)全局变量extern
(6)函数:注意传参数,不要传错类型
(7)数组:使用的时候指名index
(8)函数重载:tolua++支持函数重载。
e.g:void func (int a); 
void func (double a);
在C/C++中这代表两个不同的函数,然而在tolua里它们是同一个函数,因为int和double类型都映射到number。运行的时候tolua++决定那个函数被调用。
当性能很重要时,在.pkg文件中,我们应该把最常用的函数放在最后一个。可以看一些生成的.cpp文件中的重载函数,如果不是第一个声明的函数以外的函数在参数匹配错误的时候会执行****n-1这个函数,以此类推。
(9)函数缺省参数:在生成的 .cpp中,传参数的时候就会根据.pkg的文件中的默认参数来传递到栈中。
(10)结构体
(11)类和类方法:tolua++支持类的多态性和多重继承
(12)类模板:如果一个模板有多个宏,
class hash_map : public map<K,V> {
  TEMPLATE_BIND(K V, int string, string vector<double>)
  V get_element(K key);
  void set_element(K key, V value);
  hash_map();
  ~hash_map();
};
Lua代码这样调用:
string_vector_hash_map = hash_map_string_vector_double_:vew_local();
class vector {
  TEMPLATE_BIND(T, int, string, Vector3D, double)
  void clear();
  int size() const;
  const T& operator[](int index) const;
  T& operator[](int index);
  void push_back(T val);
  vector();
  ~vector();
};
Lua代码可以这样调用
string_vector = vector_string_:new_local()
string_vector:push_back("hello")
string_vector:push_back("world")
tolua++中对象生命周期的管理
C++类型构造函数使用tolua++导出到lua里时,析构函数也要注册到Lua。
  C++类型构造函数使用tolua++导出到lua里时,tolua++会自动生成new_local方法。如果在lua代码里,用这个方法新建对象时,tolua++会调用tolua_register_gc方法,指明回收对象时回收对象内存。
   对于指定由tolua++回收内存的对象,如果其类型的析构函数也通过tolua++导出了,则在回收内存时,会通过delete运算符,调用对象的析构函数。否则只会使用free方法回收。


tolua++性能问题:用户自定义的类型会存在多次new delete的过程

这篇关于tolua++的一些想法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/535538

相关文章

关于并发的一些想法

1.多个用户同时访问一个网站系统是并发,也会造成并发问题(但这个问题不是线程间的并发问题,不是对临界变量的并发问题。这个很容易混淆的)。这里造成的并发的问题是由于用户过多发出的http的请求过多,程序排队处理这些请求,同时,对于同一个数据库和同一tomcat来承受这些请求(可能千万个请求),同时服务器的cpu和内存等都会有问题,必然导致用户响应界面效果不好,产生卡顿现象。因此,才有了分布式、集群、

sobel_dir 方向图和sobel的一些想法

怎么使用呢! 1,通过方向图可以提取 直线 或水平线region区域,提出来的dirregion区域 2,通过sobel的幅度度,分割出变化剧烈的区域 fuduregion 3,两个region相交,可以准确定位幅度范围内+方向的边界 4,sobel算子是可以只做x,y方向的单项幅度图的,sobel_amp在一定场合有特别的用处,值得关注 5,关于大掩码超过3的size,要注意的

有关微信公众平台和html5的想法

在师哥的引导下,我接触了微信公众平台,通过这段时间的感性认识,产生了一个想法就是在微信公众平台上退出一款自己的宠物,可惜技术达不到,现在只能想想而已。不过,在初步了解html5之后,我发现,这并不是不可能实现的事情。 我说下这么想的原因吧,很简单,在微信公众平台上阅读消息,实际上就是通过微信内置的浏览器来实现的。并且自己做的div网页效果,在这个内置的浏览器上能很好的表现出来。另一个原因就是ht

有于AI想法

AI 模型的全面评估和比较   在对不同类型的 AI 模型进行全面评估和比较时,精度、速度和鲁棒性是关键指标。   精度是衡量 AI 模型准确性的重要指标。对于全能型 AI 模型,其在处理多种任务时的综合精度至关重要。然而,与专业型 AI 模型相比,全能型在特定领域可能难以达到同等的高精度。例如,在医学影像诊断领域,专业型 AI 模型经过大量特定数据的训练,能够更准确地识别病变。而全能型 AI

C++学习想法

今天是周一,今天做早操的时候舍友说准备买一本C++基础的书。我觉得这样的想法很好,突然想到自己最近几天因为自己私人原因事情很忙,蛋这不能成为我不学C++的理由。所以我在这规划了我这一周的学习进程。首先我要完善我的学生管理系统。其次就是我要好好准备周三的C++课。我现在好准备在这个月结束前开始学习JAVA,不知道我能不能实现。现在我的C++学的都还不是很精通,就开始学习java不知道是不是好高骛远呢

关于《丑陋的中国人》一些想法

看完《丑陋的中国人》,发现柏杨老师纯粹就是个喷子(不能叫愤青了)。如果他活到了现在的网络社会,肯定是个键盘侠,也是个制造热度的高手。   其实看过书之后,不难发现柏杨将中国人描述成这样子:   丑陋的中国人,偏执,迂腐,喜欢站在道德制高点,素质低。心胸狭隘,城府极深,明里一套暗地一套。阴暗,脏乱吵,嗓门大,没有安全感。喜欢窝里斗,不团结,打仗打不过日本人,做生意做不过日本人。死不认错,宁愿

Cocos2d-x教程(27)-Cocos2d-x 2.2.x tolua++使用方法

欢迎加入 Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/24626605 有时候我们需要在Lua中调用自定义的C++类中的方法,这个过程可以通过tolua++工具来实现。 概要流程如下: 1.在你的工程中手写一个C++文件,xx.h与xx.cpp

关于车的一点小想法

今天看到一个有趣的新闻, 说是重庆有两个哥们开车发生摩擦, 当街划石头剪刀布“定责”。 城市道路拥挤,乡村道路复杂,擦擦碰碰难免,当事故发生后, 有这两个哥们这样的心胸却是很少。 这种摩擦是比较烦人的, 本来对车的性能影响也不大,但是总开着一辆事故车上路,估计那天就被交警小哥哥拦下来喝茶了。所以要去补漆啥的,至少就是一周时间,想想就烦人。 我在想能不能减小这种摩擦事故呢? 其实应该有人想到了

关于代理的改进想法

网络编程,如今已经封装为socket编程,无意大大的缓解了编程的难度。因为网络设备其实是多种多样的,上层人员如果去掌握这些网络设备,然后再实现他们的功能,可能不是很现实。 socket编程将程序简化为下面的形式: A B 然而A和B之间,其实还有很多其他的节点。

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,