bLua 是 C++与Lua的胶水层,b代表着bridge
首先注册类及需要的成员函数
// 注册全局函数 bLua::reg_global_func(L, "newA", newA); bLua::reg_global_func(L, "printA", printA); // 注册类函数 bLua::reg_class<A>(L); bLua::reg_class_func(L, "get_this", &A::get_this); bLua::reg_class_func(L, "get_int", &A::get_int); bLua::reg_class_func(L, "set_int", &A::set_int); bLua::reg_class_func(L, "get_string", &A::get_string); bLua::reg_class_func(L, "set_string", &A::set_string);
然后在lua中使用即可
-- 创建一个对象 local a = newA() -- 调用对象函数 a:set_int(123) print("a:get_int() ", a:get_int()) -- 调用对象函数 a:set_string("abc") print("a:set_string() ", a:get_string())
c++调用lua全局函数
// 多个返回值 int output_int = 0; std::string output_str; uint64_t output_int64 = 0; // 输入参数 int input_int = 123; std::string input_str = "test"; // 调用 auto err = bLua::call_lua_global_func(L, "global_func_name", std::tie(output_int, output_str, output_int64), input_int, input_str); // 调用是否成功 if (err) { // 出错,输出错误信息 printf("ret error %s\n", err.value().c_str()); } else { // 成功则输出函数返回结果 printf("%d %s %llu\n", output_int, output_str.c_str(), output_int64); }
如果lua的函数在一层层table中,例如
function _G.test.func.test(a, b) return a - b end
那么c++调用lua嵌套的table函数
// 调用 auto err = bLua::call_lua_table_func(L, {"_G", "test", "func"}, "test", std::tie(output_int, output_str, output_int64), input_int, input_str);
具体例子可以参考test目录的test.cpp和test.lua
# mkdir build
# cd build
# cmake ..
# make
运行test程序
# ./bLua
首先要说一下, 为什么我们需要按需注册. 这是有深刻的教训的, 项目里实际注册的数量, 数以万计. 虽然每项注册的消耗并不多, x10000之后, 就不容小觑了. 先说静态生成wrap代码的方式, 几万个wrap方法对应的代码行数, 几十万行c#代码. 再经过il2cpp之后, 又要乘以N. 所以, 导致unity项目里面的代码行数非常大, 也导致了text段很大. 这些注册项在运行时占用的内存,
问题内容: 我目前在一个网站上工作,该网站必须存在于内存可用性非常低的VM上(目前被告知要达到512mb)。不幸的是,至少在不久的将来,数据库和Web应用程序必须是同一台服务器。 现在,我已经在这里通读了一些问题,并尝试进行自己的研究,但是这里有很多选择。从本质上讲,什么是可以安装的轻巧的数据库服务器?SQL或NoSQL并不重要;它不会占用大量数据库资源,但我现在不想随我现在选择的内容而受到限制。
主要内容:使用普通函数创建 goroutine,使用匿名函数创建goroutine在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。 虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。能否
Jenkins Pipeline插件有一个称为“轻量级签出”的功能,其中主服务器仅从repo中提取Jenkinsfile,而不是整个repo。配置屏幕中有一个相应的复选框。我想在多分支管道中进行轻量级签出,但我在多分支配置屏幕中没有看到复选框。有什么想法如何实现这一点吗?我注意到一些关闭的问题表明此功能可用,但我无法找到任何有关如何实现它的细节。 相关资料: https://issues.jenk
问题内容: JPanel和JFrame有什么区别,以及与轻量级,重量级的关系? 问题答案: JPanel是允许将多个UI组件放在一起的容器。JFrame是使用Swing编写的窗口。 所有的Swing组件都是所谓的“轻型”组件,因为它们是用Java编写的。例如,如果您运行Swing应用程序并尝试使用UI分析工具(例如Windows中的WinSpy)对其进行分析,则只会看到一个元素:窗口(JFrame
问题内容: 题 我正在寻找Java内存对象缓存API。有什么建议吗?您过去使用过什么解决方案? 当前 现在,我只是在使用地图: 要求 我需要扩展缓存以包括以下基本功能: 最大尺寸 生存时间 但是,我不需要更复杂的功能,例如: 来自多个进程的访问(缓存服务器) 持久性(到磁盘) 意见建议 内存中缓存: Guava CacheBuilder-活动开发。请参阅此演示文稿。 LRUMap-通过API配置。
主要内容:一、简介,二、Java对象头中的Mark Word,三、偏向锁,四、轻量级锁,五、重量级锁,六、自旋锁,七、锁升级过程一、简介 在讲解这些锁概念之前,我们要明确的是这些锁不等同于Java API中的ReentratLock这种锁,这些锁是概念上的,是JDK1.6中为了对synchronized同步关键字进行优化而产生的的锁机制。这些锁的启动和关闭策略可以通过设定JVM启动参数来设置,当然在一般情况下,使用JVM默认的策略就可以了。 二、Java对象头中的Mark Word HotSpo