首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Lua学习笔记

    基础知识-- --[[ 通过dofile()方法引用其他Lua文件中的函数 在Lua中全局变量不需要声明,直接赋值即可。...当对一个table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有就调用它,而不是直接赋值。...此时read将直接返回一个数字,而不是字符串。"*number"选项会忽略数字前面所有的空格,并且能处理像-3、+5.2这样的数字格式。如果当前读取的数据不是合法的数字,read返回nil。...需要说明的是,C函数无法直接将真正的返回值返回给Lua代码,而是通过虚拟栈来传递Lua代码和C函数之间的调用参数和返回值的。...而第二个API则类似于C库中的sprintf函数,并将格式化后的字符串压入栈中。

    3.4K60

    Lua学习笔记:CC++中调用Lua函数示例

    我们甚至可以封装了C/C++的函数库供Lua模块化加载后再传递给需要的C/C++项目调用工欲善其事必先利其器首先要知道一点C/C++调用Lua里的函数是通过Lua提供的虚拟栈来完成参数的转移与获取的"Lua...通过使用引用,可以将 Lua 栈上的值存储到 Lua 注册表中。当需要多次调用同一个Lua函数时,可以使用 lua_ref 来保存对函数的引用,这样可以从全局变量中查找并调用。...lua_getglobal(L, "add"); // 将栈顶的值(这里是 "add" 函数)保存到 Lua 注册表中,并返回一个整数引用 int ref = luaL_ref(L, LUA_REGISTRYINDEX...); // 从注册表中根据保存的引用获取 "add" 函数,并压入栈顶 lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_pushnumber(L, 5)...yend3.dostring调用通过 lua_dostring 或者 luaL_dostring,可以直接在 Lua 虚拟机中执行一段字符串形式的 Lua 代码。

    71920

    小白博客 反弹shell 在公网服务器执行 nc –lvv 8888

    比如,当某个table对象被存放在容器中,而容器的外部不再有任何变量引用该对象,对于这样的对象,Lua的垃圾收集器是不会清理的,因为容器对象仍然引用着他。...如果此时针对该容器的应用仅限于查找,而不是遍历的话,那么该对象将永远不会被用到。事实上,对于这样的对象我们是希望Lua的垃圾收集器可以将其清理掉的。...不论是哪种类型的弱引用table,只要有一个key或value被回收,那么它们所在的整个条目都会从table中删除。 一个table的弱引用类型是通过其元表的__mode字段来决定的。...最后需要说明的是,Lua中的弱引用表只是作用于table类型的变量,对于其他类型的变量,如数值和字符串等,弱引用表并不起任何作用。...见如下代码: 12345678910 local results = {}setmetatable(results,{__mode = "v"}) --results表中的key是字符串形式的Lua代码

    1K70

    Lua table之弱引用

    比如,当某个table对象被存放在容器中,而容器的外部不再有任何变量引用该对象,对于这样的对象,Lua的垃圾收集器是不会清理的,因为容器对象仍然引用着他。...如果此时针对该容器的应用仅限于查找,而不是遍历的话,那么该对象将永远不会被用到。事实上,对于这样的对象我们是希望Lua的垃圾收集器可以将其清理掉的。...这时候就要用到弱引用table了,弱引用table的实现也是利用了元表。 Lua中的弱引用表提供了3中弱引用模式,即key是弱引用、value是弱引用,以及key和value均是弱引用。...不论是哪种类型的弱引用table,只要有一个key或value被回收,那么它们所在的整个条目都会从table中删除。 一个table的弱引用类型是通过其元表的__mode字段来决定的。...最后需要说明的是,Lua中的弱引用表只是作用于table类型的变量,对于其他类型的变量,如数值和字符串等,弱引用表并不起任何作用。

    2K70

    Lua进程内存优化方案总结

    所有物品共用一张元表。 显而易见,通过共用base的默认值,很多重复的Key-Value被优化掉了,也就节省了内存。 这种方法适合于结构一致,且有大量相同值的情况。...而既然都序列化为二进制字符串了,那干脆再调用下lz4压缩下,牺牲一点点CPU换来更高的优化效果。...小结 所以考虑热更新需求和代码复杂度,我们并不直接使用protobuf的反射库,改为自己实现一套类似的内存布局管理。 同时protobuf的内存生命周期管理也不是我们期望的,这个下面会讲到。...而什么时候从hashmap删掉呢?自然是没有使用了,Lua通过GC来删掉。比如: local a = "test" a = nil 其他需要GC的类型比如Table、UserData也是同理。...那既然我们把Lua内存下沉到C++,Lua复杂的结构如何保证既不会内存泄露,又不会野指针呢?要知道,Lua的Table是可以随便相互各种引用的。 是不是也要复刻这套GC呢?

    57621

    手游热更新方案--Unity3D下的CsToLua技术

    [5.png] OpCodes.Ldstr 字段:推送对元数据中存储的字符串的新对象引用。...指令将一个对象引用推送 (类型 O) 到一个新的字符串对象,表示存储的元数据中的特定字符串文字; OpCodes.Call 字段:调用由传递的方法说明符指示的方法。...= ToLua基于LuaInterface,LuaInterface是一个实现Lua和微软.Net平台的CLR混合编程的开源库,使得Lua脚本可以实例化CLR对象,访问属性,调用方法甚至使用Lua函数来处理事件...提供了一套中间层导出工具,对于需要访问的CLR、Unity及自定义类预生成Wrap文件,Lua访问时只访问Wrap文件,Wrap文件接收Lua传递来的参数,进行类型(值、对象、委托)转换,再调用真正工作的...: [20.png] C#中的对象在传给Lua时并不是直接把对象暴露给了Lua,而是在这个OjbectTranslator里面注册并返回一个索引,并把这个索引包装成一个userdata传递给Lua,并且设置元表

    2.6K20

    【Unity面试篇】Unity 面试题总结甄选 |热更新与Lua语言 | ❤️持续更新❤️

    Lua中 点和冒号区别 点 :无法传递自身,需要显示传递 冒号 :隐式传递自身 17....如何实现深拷贝 复制对象的基本类型,也复制源对象中的对象 常常需用对Table表进行深拷贝,赋值一个全新的一模一样的对象,但不是同一个表。...如果key和value都不包含table属性,那么每次在泛型for内调用的Func就直接由if判断返回具体的key和value。...nil,所有索引值都需要用 “[“和”]” 括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引,Lua table 是不固定大小的,你可以根据自己需要进行扩容; table...require从package.loader中获得的值仅仅是对那张表(模块)的引用,改变这个值并不会改变require使用的表(模块)。

    2.4K31

    Unity3d热更新之xLua热更新

    ="123" 下面就可以直接用c#来获取lua文件夹中的main.lua和test.lua了//首先还是初始化lua解析器LuaMgr.GetInstance().Init();//执行main.luaLuaMgr.GetInstance...().DoLuaFile("main");知识点: 下面获取到全局变量,就用到了lua的相关知识点中的_G表将我们申明的所有全局变量都存储在其中,但是Lua脚本中的本地局部变量的是无法直接获取的 所以我们就可以用...因此,当一个方法需要返回多个值的时候,就需要用到ref和out。ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。...(简单来说就是在参数前加ref,并需要先对参数初始化)out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。...(这里需要注意私有和保护的变量是无法获取到的,而且公有变量是可多可少的,如果某个变量不需要,可以不写,结果只会被忽略得不到值而已,多出的变量也不会赋值,并且自动忽略,不会影响整体的效果,而类属于值传递,

    3.3K32

    黑科技:用UE4的FName优化掉100MB的Lua内存

    他的容量非常小,当游戏逻辑在用来传递参数,比较等操作时,只传递或比较索引,而不需要对字符串本身的内容做操作,就可以显著的提升游戏性能。...普通的变量在lua内部结构如上图所示,由Value+类型组成,其中Value是一个union共用体,当不是gc对象时,Value内部就直接存值,而如果是gc对象,Value会存储对象的指针(和UE4的UObject...因为字符串本身是gc对象,所以Lua内部是通过一个字符串指针间接存储的。 真正的对象,实际是存储在Lua的global_state上一个全局字符串表里。...lua在创建字符串的时候,如果是小于40字节的字符串,就会调用上图的函数,先计算hash,并到全局的字符串表中查找,找到了就直接返回,没找到就新创建字符串,并保存在全局字符串表中。...lua的字符串池和UE4的NamePool,唯一不同的是lua的字符串会在没被引用时被GC销毁,且区分大小写。

    3K20

    2022年Unity面试题分享

    StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。...:都是地址 指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。...sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小; 引用是类型安全的,而指针在不安全模式下 ---- 【重点面试题】30、using的作用 资源...6、合成复用原则CRP(Composite Reuse Principle) 合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。...1.如何实现lua面向对象编程 2.lua里表和元表是什么 3.状态同步是如何实现的 4.状态同步网络卡顿如何解决 5.项目的使用什么架构框架体系?

    5K11

    从一个170倍内存的优化说起脚本方案评估

    所以基本上可以确定v8内部实现不是我们想象那样:字符串链接后的新字符串会保存所有字符。应该做了某种优化。...和一些重度使用lua脚本的游戏交流,有的项目能占到200~300M,有的项目会把策划配表加载到内存,光是策划配表就有80M,这时基础内存的占比就几乎可以忽略了,而虚拟机的一些内存使用效率优化的作用会凸显出来...还有一个不容忽视的事实是,v8的gc有做内存整理,而lua没有。lua长时间运行,除了纸面上能统计到的内存占用,还有那些虽然空闲,但因碎片化而使用不了的隐性占用。...引用参数的处理,在lua由于支持多返回值,引用参数输出时可以作为一个返回值,而js没有,puerts把参数装箱到一个js对象中,返回时把输出放到这个js对象,这意味着多了一个js对象的创建。...比如苹果的jscore每个api全局加锁,它和原生交互就比v8要慢一个数量级,而v8嵌入api基本不会对外暴露数据结构,也不会让外部直接持有指针,而是通过句柄持有,传输数据用值拷贝。。。

    1.3K10

    Lua:深拷贝与浅拷贝,强引用与弱引用

    对于 string,虽然它本身不是简单值类型,但在 lua 中有特殊的内存管理方式,不能直接去修改它的值,而且任何影响它的操作都会创建新的副本——不会影响本体,所以它符合我们对拷贝的定义。...table 的 key-value 递归拷贝,此外还要考虑元表等相关处理 通过对 lua 基本类型的分析,可知只需要对 table 类型进行递归拷贝即可。...因为lua是具备自动内存管理的,我们只管创建,删除操作是lua自动进行的,因此这里的a = nil并不是删除表,而是指将a对这张表的引用去掉,当没有地方引用这张表时,这张表就会被lua自动清掉。...如果一个对象只存在弱引用,那么它就会被回收。lua中通过弱引用table来实现弱引用。弱引用table有三种形式: 1.key值弱引用。...设置方法为setmetatable(b, {__mode = “kv”}) b的value对其指向的对象的引用是弱引用,而b的key对其指向的对象的引用仍然是强引用(对于table来说,其key和value

    84450

    SWIG 官方文档第四部分 - 机翻中文人肉修正

    注意字符串格式化是如何在 Python 而不是 C 中完成的。需要注意的是,传递的字符串必须在 C 中安全使用。...例如: C++ void spam1(Foo *x); // 通过指针传递 void spam2(Foo &x); // 通过引用传递 void spam3(Foo x); // 按值传递 void...对于 'sx' 和 'sy' 它们必须被传入(因为它们是输入),但原始值不会被修改(Lua 没有通过引用传递的特性)。然后将修改后的结果作为两个返回值返回。...第二种更直观的方法是将 Lua 表直接传递给函数,并让 SWIG 在 Lua 表和 C 数组之间自动转换。在 文件中,有已准备好的类型映射来执行此任务。.... %} 请注意,代码不是模块表的一部分。因此,对模块的任何引用都必须添加模块名称。 如果 Lua 代码中有错误,这不会停止加载模块。SWIG 的默认行为是将错误消息打印到 stderr,然后继续。

    6.2K40

    Lua05——Lua基本数据类型

    lua 是动态类型语言,变量使用前不需要定义类型,在使用时直接赋值即可。 1 基本数据类型 值可以存储在变量中,作为参数传递或作为结果返回。...lua中的表,其实是一个关联数组,数组的索引可以是数字、字符串或表类型。...在Lua里 table 的创建是通过构造表达式来完成,最简单构造表达式是{},用来创建一个空表。 2 获取数据类型 通过函数 type 可以返回一个值或一个变量所属的数据类型。...hello world hello world hello\nworld 字符串的内化:如果有多个完全一样的字符串,在lua中仅会保存一份。...1开始 swim 当引用的索引不存在时,输出为 nil print(ta["abc"]) 输出  nil 2.6 function lua 中函数也可以作为变量使用。

    81120
    领券