在嵌入式系统上使用c++有哪些需要注意的? (内存与性能限制)

冬芳君_9277

冬芳君_9277

2026-01-20

498人浏览

原创

c++oding="utf-8" ?>

嵌入式C++需避免STL动态分配、虚函数和异常等隐式开销,改用std::array、CRTP、静态内存池,并严格控制栈空间与编译选项。

在嵌入式系统上使用c++有哪些需要注意的? (内存与性能限制)

避免 STL 容器动态内存分配

嵌入式系统通常没有完整堆管理或禁用 malloc/free,而标准 STL 容器(如 std::vector、std::string)默认在堆上分配内存,运行时可能崩溃或不可预测。

  • 改用固定大小的栈数组或预分配缓冲区,例如用 std::array 替代 std::vector
  • 若必须用动态容器,选用无堆依赖的替代库(如 etl 或 folly::small_vector 的裁剪版),并确保其配置为使用静态内存池
  • 禁用异常和 RTTI 后,部分 STL 实现仍会隐式调用 operator new——需检查编译器链接的 libstdc++/libc++ 是否启用了 -fno-use-cxa-atexit 和自定义 new 操作符

慎用虚函数与运行时多态

虚函数表(vtable)增加 ROM 占用,虚调用引入间接跳转开销,在 Cortex-M0/M3 等无分支预测的小核上延迟明显;且每个含虚函数的类实例额外携带 4 字节 vptr。

  • 优先用模板 + CRTP(Curiously Recurring Template Pattern)实现编译期多态
  • 若必须运行时分发,考虑函数指针表或状态机枚举,而非继承+虚函数
  • 确认编译器是否内联了简单虚函数调用(g++ -O2 可能优化掉单实现类的虚调用,但不可依赖)

控制编译器生成代码体积与延迟

默认 C++ 编译选项常为通用场景优化,嵌入式需主动约束:避免模板爆炸、抑制冗余符号、关闭非必要 ABI 特性。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 添加 -fno-exceptions -fno-rtti -fno-threadsafe-statics,防止隐式插入异常处理桩和 guard 变量逻辑
  • 对时间敏感函数加 __attribute__((optimize("O3,fast-math,no-tree-vectorize")))(注意 fast-math 可能破坏 IEEE 浮点语义)
  • 用 arm-none-eabi-g++ -ffunction-sections -fdata-sections 配合链接脚本 --gc-sections 删除未引用代码/数据
  • 检查 sizeof 和 alignof —— 某些 STL 类型(如 std::function)在不同工具链下尺寸差异极大,可能意外撑爆栈

栈空间必须显式估算并监控

嵌入式通常只配几 KB 栈(如 2KB),而 C++ 默认栈行为比 C 更“激进”:临时对象、隐式拷贝、异常栈展开都会快速耗尽空间,且多数 MCU 无栈溢出检测。

  • 禁止递归调用,所有函数调用深度应静态可分析(可用 arm-none-eabi-gcc -fstack-usage 生成 .su 文件)
  • 避免大尺寸局部对象:std::array 直接压栈,等价于裸数组但更易被忽略
  • 重载全局 operator new 和 operator delete 为 panic-on-fail,而非返回 nullptr;同时禁用 placement new 以外的所有 new 形式
  • 启动时用 MPU 或软件标记栈末尾(如填魔数),运行中定期校验——很多硬故障实际是静默栈溢出覆盖了相邻变量
extern "C" void* operator new(size_t size) {
    while(1); // 或触发 HardFault
}
extern "C" void operator delete(void*) noexcept {}

C++ 在资源受限环境不是不能用,而是每个语法特性都要问一句:它悄悄申请了什么内存?增加了多少指令周期?有没有替代的、更透明的写法?最危险的从来不是写不出功能,而是没意识到某行看似干净的 std::string s = "hello" 正在往只剩 64 字节的栈里塞 24 字节对象加堆分配。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

字节 c++ c++嵌入式系统

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7559

3

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

399

31

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

7047

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2888

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

7047

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2888

6

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2023.11.13

3591

4

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.29

1085

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程