c swap方法在哪个库里面_IOT操作系统用C++库的经验总结
1 背景
最近帮产品攻关一个问题,一个产品ROM/RAM资源特别紧张。由于开发团队使用了C++,静态引入libstdc++库增加了500K ROM。同时text/data也需加载到RAM才可以执行,导致RAM耗费也不少。开发团队短期内无法完全用C进行重构,需要看看是否有一些短期有效的方案。
2 问题调查
2.1 优化前后比较使用的工具
- 查询方法占用的大小:readelf -sW <elf文件> | awk -F' {1,}' '{print $9,$4}' | sort
- 查看整体需要被LOAD到内存段信息:readelf -l <elf文件>
- 查看编译后文件大小: ls -lh <elf文件>
2. 2 网上优秀资料汇总
1,如何在嵌入式C++开发中缩减代码尺寸
如何在嵌入式C++开发中缩减代码尺寸kuangqi.me
2, How to Reduce Binaries Size
Android NDK: How to Reduce Binaries Size – The Algolia Blog | Algolia Blogblog.algolia.com
这两篇文档主要核心方法总结:
- 编译器参数
- -ffunction-sections -fdata-sections
- -ffunction-sections -fdata-sections
- -fno-exceptions
- -fno-rtti
2. 衔接器参数
- -Wl,--gc-sections
3. 编程技巧
- Do not use stream
3 修改结果
本身项目中已经把编译器和衔接器手段都用了,但是仍旧有500K,只能重构代码,第一步把代码中的stream的使用代码都删除,发现节省比较大的空间:
1.4M可以减少到1.1M,基本可以满足诉求了。
把所有c++ stream的引入都删除,对应代码重构,幸运的是开发人员用的很少,很容易替换
#include <fstream>
#include <iostream>
4 业界IOT OS对C++使用调查
4.1 开源OS对C++支持情况
在IOT设备上资源非常紧张,对于大部分IOT OS上都不支持C++运行环境,对于支持C++的IOT OS是如何做的呢,做一些简单分析:
- Contiki:开源,语言C
- Android Things:闭源,语言Java/C/C++
- Riot:开源,语言C
- Apache Mynewt:开源,语言C
- LiteOS:开源,语言C
- Zephyr:开源,语言C
- TinyOS:开源,nesC
- Fuchsia:目前还是开发中,C/C++/Rust/Dart
- Windows IoT:闭源,. Net
- TizenRT:开源,C语言
- Raspberry Pii:开源,语言C
- Amazon FreeRTOS:开源,语言C
- Mbed OS:开源,语言C/C++
- RT-Thread:开源,语言C
- RIOT:开源,语言C/C++
- Nuttx:开源,语言C/C++
因为Android Things闭源,Fushia目前仍旧在开发中,在一些低端IOT设备上并不合适。我们对Mbed/RIOT/Nuttx使用的C++ 工具链和基础库做一个简要分析
4.2 Mbed对C++支持分析
Mbed OS是ARM公司开发的一个用于IOT的OS,资源
ARMmbed/mbed-osgithub.com
The current baseline version is C++14,但是做了如下限制:
- chrono and threads依赖OS支持的,不建议使用
- atomics and shared pointers:跟硬件相关,不建议使用
- like streams and STL containers are quite heavy and may not be appropriate for small embedded use
- ARM C 5仅支持部分C++11特性,mbedOS提供了一些mbed的替换实现,例如use
#include <mstd_utility>
, - 一些移植性不好的特性:std::thread慎用
4.3 RIOT对C++支持分析
https://github.com/RIOT-OS/RIOT/tree/master/sys/cpp11-compatgithub.com
支持C++11,针对OS和硬件相关特性进行了替换实现:
replacement to enable C++11-like thread, mutex and condition_variable
4.4 Nuttx对C++支持分析
apache/incubator-nuttxgithub.com
A fragmentary C++ library that will allow to build only the simplest of
C++ applications. In the deeply embedded world, that is probably all
that is necessary.
提供了一个非常简单的库的实现,可以用最简单的C++特性。Nuttx也可以使用配置项CONFIG_LIBCXX=y选择LLVM "libc++"(http://libcxx.llvm.org/)或者CONFIG_UCLIBCXX=y选择uClibc++ C++ library (http://cxx.uclibc.org/)。
5 总结
5.1 编程注意
- 禁止使用streams and STL containers
- chrono,thread, mutex and condition_variable平台相关,最好不要使用
- atomics and shared pointers:硬件相关,不建议使用
std::size_t
平台相关,不建议使用std::swap
(<utility>
) :硬件相关std::void_t
(<type_traits>
):不建议使用。
5.2 平台适配
C++很多特性和硬件相关,使用C++的IOT系统也需要做一些裁剪和适配。
在IOT OS上谨慎使用C++,C的移植性最好。
c swap方法在哪个库里面_IOT操作系统用C++库的经验总结相关推荐
- linux 动态库 软链接,Linux操作系统下动态库的生成及链接方法
下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作 libth ...
- List元素互换,List元素转换下标,Java Collections.swap()方法实例解析
Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...
- win7怎么看服务器文件管理,Win7库文件管理器怎么用 Win7库功能及其使用方法详解...
使用window7的用户都会注意到,系统里有一个极具特色的功能--"库",库是win7系统借鉴Ubuntu操作系统而推出的文件管理模式.库的概念并非传统意义上的存放用户文件的文件夹 ...
- linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...
Linux下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作l ...
- python连接opencv库_利用Python和OpenCV库将URL转换为OpenCV格式的方法
今天的博客是直接来源于我自己的个人工具函数库. 过去几个月,有些PyImageSearch读者电邮问我:"如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)&qu ...
- android 加载三方so的方法_Android开发教程之动态加载so库文件的方法
Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...
- 搜狗输入法词库php词库怎么用,搜狗输入法添加词库方法说明,打字更方便
搜狗输入法添加词库方法说明,打字更方便 2020-04-04 无论是电脑端还是手机端,搜狗输入端都是一款深受大众欢迎的打字软件,它提供了词库管理功能,用户可以随时添加词库,便于更好完成输入.搜狗输入法 ...
- Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法
若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...
- vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析
目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...
- 基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法
基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法 FB库功能说明: 可对模拟量进行平均值滤波处理,某些从现场采集的模拟量信号在传输过程中易出现干扰,可能导致数据失真,使用该FB库可 ...
最新文章
- netstat 查看端口命令
- axis2 java客户端内存溢出怎么办_java - Axis2-总是出现404错误 - 堆栈内存溢出
- [web安全]深入理解反射式dll注入技术
- mdp框架_强化学习:MDP(Markov Decision Process)
- P1829-[国家集训队]Crash的数字表格/JZPTAB【莫比乌斯反演】
- torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
- 两条平行导线同向电流_如何根据功率计算电流?老师傅说这么做很简单
- 杀死系统中的进程kill和killall命令
- Bash脚本15分钟进阶教程-转
- mysql 查询若干小时之内的数据
- 惠普T5325 惠普T5565 惠普T5400 瘦客机评测
- B站三季度财报解读丨从0到2.67亿月活,B站生态亮眼的密钥何在?
- 软件测试创业公司和大厂外包如何选择?
- Unity3d用脚本实现Button图片的更改
- C++和java的异同点总结
- android遥控器适配
- Java工程师应该知道的Web安全
- 黑白棋出现pass 的条件 java_JAVA黑白棋之学习感悟
- rx6700xt相当于什么n卡
- iphone6 续航 测试软件,iPhone 6s电池续航能力究极测试 1715毫安电池逆天了