cheerp数据类型包装
这个文章主要描述在cheerp环境下, js和c++侧数据类型的转换和包装内容。
1 基础数据类型
首先我们知道javascript是弱类型的脚本语言,开发者在开发的时候不必关注数据的类型和边界,而c++是静态编程语言, 在编译阶段就需要确定类型,在编译器处理的时候可以获得更好的优化。
我们都知道js所拥有的数值类型,(int,uint,float,double)默认不区分都是double类型存储,这点和lua很相似。
在一般堆栈机下,如果使用函数调用会有大量的push,pop指令来获取传递的参数,还要在内部进行根据类型包装成可识别的类型。
cheerp的内存模型是平坦的,目标如果不是wasm的话, 是和js一致的,可以直接调用(翻译成javascript,不需要push,pop这种指令)。
在cheerp环境下如果交织javascript和c++代码, cheerp会通过位移移除来替我们处理类型, 比如int类型,用js的Number左移两位来标识。我们可以不关心这些基础数据的转换。
2复合数据类型
如果是js模式,cheerp会将js对象转换成struct,或者是class类的映射,默认不推荐使用动态结构。 首先要在cheerp侧拥有对应的结构定义,才能获取和写入属性。
从js侧生成库给c++使用:
比如公开一个函数到c++
function window_base64_encode(s) {
return window.btoa(s);
}
我们在c++里定义
String * window_base64_encode(String *);
cheerp 会自动给我们生成函数调用参数的原型,并切映射到js侧.
如果是传输的对象我们可以使用Object* 来标识js侧的对象。
Object * window_getData(String * );
如果是wasm模式,cheerp会严格遵守c++标准,对数据进行转换。
如果要传输复合类型的数据,比如说对象那么我们需要用struct对基础数据进行包装.而不是直接使基础类型.
struct Sub {
int age ;
};
struct Data {
char hellow [20];
int age ;
struct Sub c;
};
等同于{age:20, c:{age:21},hellow:"cheerp"}
从c++调用js:
//JSExportAPI::test();
uint8 Indata[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for(char i = 0; i < 16; i++) {
Indata[i] = i; ///用例
}
JSExportAPI::myJsSayHello(Indata); ///wasm调用js
for(char i = 0; i < 16; i++) {
std::cout << (*Indata+i)<< endl; //结果
}
从js调用c++
int myCppSayHello(Data a) {
cout << "hellow i am from cpp " <<endl;
cout <<"hellow="<< a.hellow <<endl;
cout <<"age="<< a.age <<endl;
cout <<"sub.age="<< a.c.age <<endl;
return 0;
}
class [[cheerp::genericjs]] JSExportAPI {
public:
JSExportAPI() {
}
static void myJsSayHello (uint8 * buffer) {
Uint8Array * t = (Uint8Array *)cheerp::MakeArrayBufferView(buffer);
auto array = cheerp::makeArrayRef(t);
for( int i = 0 ; i < array->get_length(); i++ ) {
array[i] = array[i] + 100 ;
*(buffer+i) = array[i];
}
struct Data d ;
d.age = 20;
d.c = {21};
memcpy(d.hellow ,"cheerp", 7);
myCppSayHello(d);///js调用wasm
}
};
[[cheerp::genericjs]] 字段是生成js模式的代码。
无论是js到c++还是c++到js, cheerp转换的开销比一般的(ffi)的技术开销要小很多。类型包装也是他性能优化的基础方式之一。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
基于结构化平均感知机的分词器Java实现
基于结构化平均感知机的分词器Java实现 最近高产似母猪,写了个基于AP的中文分词器,在Bakeoff-05的MSR语料上F值有96.11%。最重要的是,只训练了5个迭代;包含语料加载等IO操作在内,整个训练一共才花费23秒。应用裁剪算法去掉模型中80%的特征后,F值才下降不到0.1个百分点,体积控制在11兆。如果训练一百个迭代,F值可达到96.31%,训练时间两分多钟。 数据在一台普通的IBM兼容机上得到: 本模块已集成到HanLP 1.6以上版本开源,文档位于项目wiki中,欢迎使用!【hanlp1.7新版本已经发布,可以去新版本查到看使用】 结构化预测 关于结构化预测和非结构化预测的区别一张讲义说明如下: 更多知识请参考Neubig的讲义《The Structured Perceptron》。 本文实现的AP分词器预测是整个句子的BMES标注序列,当然属于结构化预测问题了。 感知机 二分类 感知机的基础形式如《统计学习方法》所述,是定义在一个超平面上的线性二分类模型。作为原著第二章,实在是简单得不能再简单了。然而实际运用中,越简单的模型往往生命力越顽强。 这里唯一需要补充的...
-
下一篇
2018年终盘点!百篇前端文章干货合集!
在寒冬最值得投资的是学习,我们整合了2018年云栖社区百篇前端技术文章供大家学习参考。为了让营造一个针对前端语言的技术交流平台,我们特意新建了一个前端技术交流群。钉钉群号: 23351485 在前端技术交流群里,我们邀请了阿里最优秀的前端技术专家定期为大家做直播技术分享、问题答疑。您可以直接与阿里技术大咖探讨前端技术的奥秘!更多线下沙龙活动等你参加!我们还会有阿里定制的精美小礼品相送! 欢迎前来【前端那些事儿】发文 我们为大家挑选了百篇云栖社区优秀的前端技术博文来学习: 浅谈几个前端异步解决方案一步一步的了解webpack4的splitChunk插件Vue + GraphQL初试网上看到的“12个非常有用的JavaScript技巧”前端leader找我谈心:我是如何从刚毕业的前端菜鸟一步步成长为前端工程师的?如何用JavaScript手动实现一个栈使用 vuetron 调试 mpvue 项目JavaScript 设计模式之单例模式Vue.set()实现数据动态响应Css规范整理:3.4、常规流布局:相对定位2019年10个最受欢迎的JavaScript动画库!2019,聊聊Web技术的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果