Lua 栈的理解
提到C++与lua互调,不可不提栈。
栈是C++和Lua相互通讯的一个地方。
首先这个栈并不是传统意义上的栈(传统的栈需要放同一种数据类型,但在网上的某些资料说,每个栈元素是一个联合体)。
栈从上向下分别是-1,-2,-3... ; 从下向上分别是1,2,3...
这也就是lua_gettop为什么可以获得栈中总元素数的原因。因为lua_gettop()获得的是从下向上栈顶的索引,因为从1开始,栈顶的索引也即是总元素数。
1.
lua_getglobal(L,“lua变量名");
这个函数会将lua中的某变量放置到栈顶,于是C++就可以取了。
2.
lua_tointeger(L, "某索引")
将某索引的栈中元素取得(并不出栈),索引可为正或者负。
同系列的还有lua_toboolean,lua_tostring等。
3.
lua_call(L,参数个数,返回值个数)
在调用之前,要将函数名,各个参数,分别入栈。
4.
lua_register
将某C函数注册(建立与lua函数的关联关系 )
可以想象内部有一个map<string(lua函数名) ,C函数指针>
要注意 函数的返回值要是int ,参数要是lua_State*
查看lua_CFunction的定义,就明白为什么了。
5.打印整个栈
这个是很重要的一个技巧,尤其在初学阶段。
我就曾经被网上一段错误代码弄的百思不得其解,后来通过打印栈的方式,明白他写的是错的。
而且通过打印栈我还发现,调用luaopen_base(L)系列函数时,每调用一个,会在栈中push一个table
这也就是为什么说lua所有变量,函数(函数其实也是变量),
都在lua_State中的原因。
//该函数来自网络
void stackDump(lua_State* L)
{
int i;
int top = lua_gettop(L);
printf("stackDump(num=%d):\n",top); for (i = ; i <= top; i++) { /* repeat for each level */
int t = lua_type(L, i);
switch (t) { case LUA_TSTRING: /* strings */
printf("`%s'", lua_tostring(L, i));
break; case LUA_TBOOLEAN: /* booleans */
printf(lua_toboolean(L, i) ? "true" : "false");
break; case LUA_TNUMBER: /* numbers */
printf("%g", lua_tonumber(L, i));
break; default: /* other values */
printf("%s", lua_typename(L, t));
break; }
printf(" "); /* put a separator */
}
printf("\n"); /* end the listing */ }
Lua 栈的理解的更多相关文章
- 栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈
文章首发于浩瀚先森博客 #栈的理解 一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值. Stack是为了程序运行过程中临时保存所需数据而在内存里分配的 ...
- 堆&栈的理解(转)
(摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...
- 通过lua栈了解lua与c的交互
lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...
- lua栈
既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.,先关注的是Lua栈的分配,管理和相关的 ...
- lua和C++交互的lua栈操作——以LuaTinker为例
一. -- C++类注册函数(LuaTinker) 的lua栈操作: -- lua栈内容(执行到pop语句) 栈地址 <--执行语句 space_name[name] = t1 -- (2b8) ...
- Lua 栈中元素的位置
Lua与C.C#等的交互是通过栈来实现的,每次插入元素都是放在栈顶(top),至于元素的index,可以使用正数和负数两种方式, 如取栈底开始至第index个元素 -index = gettop - ...
- c调用 lua 栈操作
转自https://www.cnblogs.com/ringofthec/archive/2010/10/22/lua.html 打算记录一些lua_api, 可能会觉得lua文档中已经说的很清楚了, ...
- 【转载】iOS堆和栈的理解
操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme ...
- Struts2 中的值栈的理解
通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...
随机推荐
- Java 内存区域和GC机制分析
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- 总结--解决 mysql 中文乱码
首先分析一下导致mysql 中文乱码的原因: 1.建表时使用了latin 编码 2.连接数据库的编码没有指定 3.写入时就已经乱码(这种情况需要自己检查源数据了) 解决方法总结: 1.创建库时指定编码 ...
- mvc 4 ActionFilterAttribute 特性,进行权限验证
权限验证: /// <summary> /// 管理员身份验证 /// </summary> public class BasicAuthenticationAttribute ...
- Form表单(回车)提交问题
我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此.比如搜索行为,希望输入完关键词之后直接按回车键立即提交表单,而有些复杂表单,可能要避免回车键 ...
- 优化openfire服务器,达到单机20万,集群50万
openfire压测概述 个月左右的测试,总算得到预定目标(3台服务器,并发50w用户在线) 测试环境搭建 压测客户端无他-tsung,尝试了windows安装perl失败后,使用centOS6.5作 ...
- 搭建高可用mongodb集群(一)——配置mongodb
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...
- 一起买beta版PHP单元测试
一起买beta版PHP单元测试 测试目的 保证代码质量,对各个单元进行测试,可以有效地保证代码的可靠性,让模块在与别的模块整合时出现更少的错误. 单元描述 完成帖子接口 将"正在进行&q ...
- [game]十字链表的AOI算法实现
AOI主要有九宫格.灯塔和十字链表的算法实现.本文阐述十字链表的实现和尝试. 1. 基本原理 根据二维地图,将其分成x轴和y轴两个链表.如果是三维地图,则还需要维护多一个z轴的链表.将对象的坐标值按照 ...
- jenkins---配置邮件
如果出现以下错误: 553 mail from must equal authorized user 看看管理员邮箱是否配置: 再测试,就能够正常收到邮件了!
- net 调用https接口
public static void ProcessRequest() { //类似浏览器确认证书合法方法的绑定 ServicePointManager.ServerCertificateValida ...