0Pricing
C++ Academy · 课时

嵌入式环境中的约束:无 RTTI、无异常

在通常禁用 RTTI 和异常的嵌入式子集环境中进行开发

嵌入式环境中的约束:无 RTTI、无异常 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

嵌入式 C++

嵌入式系统存在诸多限制:RAM 有限、没有 MMU,并且有实时期限。C++ 的“自由站立式”子集移除了成本过高的语言部分。

为什么不使用 RTTI?

RTTI(运行时类型信息)支持 dynamic_cast 和 typeid。每个多态类都会携带一个额外指针;RTTI 表会增加代码体积。请使用 -fno-rtti 禁用它。

为什么不使用异常?

异常需要栈展开表和运行时支持,这会增加代码体积并导致时序不可预测。许多嵌入式代码库会使用 -fno-exceptions。

g++ -fno-rtti -fno-exceptions main.cpp

不使用异常进行错误处理

请使用:

  • 返回码(std::expected、std::optional、错误枚举)
  • 用于返回结果的输出参数
  • 用于系统错误的 std::error_code

结果类型

C++23 的 std::expected<T, E> 表示一个值或一个错误,类似于 Rust 的 Result。许多嵌入式项目已经使用自定义的 Result 类型。

std::expected<int, ErrorCode> parse(const char* s);

if (auto r = parse("42"); r) use(*r);
else                       log_error(r.error());

避免动态分配

堆碎片会严重影响实时性。嵌入式代码通常禁止在启动阶段之外使用 new。请使用:

  • 栈分配
  • 静态数组
  • 内存池
  • 适用于嵌入式环境的分配器

静态内存模式

在编译时或启动时预留内存。

template <typename T, size_t N>
class StaticVector {
    alignas(T) char storage_[sizeof(T) * N];
    size_t size_ = 0;
public:
    void push_back(const T& v);
    // ...
};

编译期多态

在可能的情况下,请使用模板或 CRTP 替代虚函数,这样无需虚函数表,也无需间接调用。

template <typename Derived>
class Base {
public:
    void process() { static_cast<Derived*>(this)->process_impl(); }
};

class Concrete : public Base<Concrete> {
public:
    void process_impl() { /* ... */ }
};

自由站立式标准库

自由站立式 C++ 子集不包含大部分 <iostream>、线程支持和动态分配功能。标准明确规定了其中可用的内容。

etl:嵌入式模板库

嵌入式模板库(ETL)提供类似 STL 的容器,其大小确定且不使用动态分配。

代码体积方面的注意事项

使用 -Os 优化代码体积,使用 -flto 进行链接时优化,并使用 -ffunction-sections -fdata-sections -Wl,--gc-sections 删除未使用的代码。

现实世界:火星探测车与汽车

C++ 广泛用于安全关键型嵌入式系统,包括汽车(AUTOSAR)、航空航天(MISRA)和医疗领域(IEC 62304)。编码标准会进一步限制语言的使用方式。

快速检查

哪个编译器选项可以禁用 C++ 的异常支持,以减小二进制文件体积?

回顾

嵌入式 C++ 会禁用 RTTI 和异常,以减小代码体积并提高可预测性。请用静态内存替代堆,用结果类型表示错误,并使用 CRTP 实现多态。MISRA 等编码标准还会进一步限制语言的使用。

常见问题解答

「嵌入式环境中的约束:无 RTTI、无异常」课时是免费的吗?

是的 — 「嵌入式环境中的约束:无 RTTI、无异常」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「嵌入式环境中的约束:无 RTTI、无异常」这节课中我会学到什么?

在通常禁用 RTTI 和异常的嵌入式子集环境中进行开发 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「嵌入式环境中的约束:无 RTTI、无异常」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 嵌入式环境中的约束:无 RTTI、无异常
  2. 内存映射 IO 与 volatile
  3. 实时系统的考量与延迟
  4. 面向 ARM 目标的交叉编译
← 返回 C++ Academy