C++ 适合微小的嵌入式目标吗?

Is C++ suited for tiny embedded targets?

我们目前正在重新设计我们的嵌入式软件,并将 Cortex-M 微控制器从 8 位升级到 32 位。内存非常有限(128 kByte Flash 和 32 kByte RAM)。 在 another thread an embedded software library (www.redblocks.de) 中被推荐。它似乎很好地满足了我的需求,但需要使用 C++。 有没有人有像我们这样的嵌入式平台上的 C++ 经验?我想知道与 C 相比,我正在处理什么样的开销。

我自己不是嵌入式开发人员,但我有几位同事在您所针对的那种微控制器上使用 C++。

该语言本身不会增加很多开销,但如果您在 Flash/RAM 方面受限,则不建议使用标准库(容器、算法...)。

如果性能是一个问题,您可能还想避免 RTTI 和异常。

有关 this paper or on this page 的更多信息。

Scott Meyers 的 Effective C++ in an Embedded Environment 书也是一个很好的信息来源。

根据您使用的 C++ 功能,与 C 相比几乎没有开销。

以下是比较的一些功能:

  • 使用不带虚拟方法的 classes 会产生相同的二进制代码 作为 C 函数处理作为传递的数据结构 指针
  • 当使用带有虚方法的classes时,在对象的数据段添加一个vptr,在文本内存段引入一个vtable。类似的功能可以用函数指针(也占用内存)在 C 中实现。一旦 class 中有多个虚方法,使用 C++ 时通常会得到更高效的二进制代码,而不是用 C 手动为每个对象引入多个函数指针。
  • 异常处理的效率因编译器而异。
  • RTTI 会增加开销,不应在微型嵌入式目标上使用。
  • 在没有虚拟内存管理的平台上,两种编程语言都应避免使用非确定性动态内存(C 中的 malloc/free 和 C++ 中的 new/delete)。
  • 模板与 C 预处理器宏有很多共同之处,因为它们是在编译时求值的,并且是一种编译时源代码生成。因此,它们不会增加任何运行时开销。然而,不经意地使用它们会导致代码臃肿。如果在正确的地方使用,它们甚至可以帮助减少运行时开销。

我认为最具挑战性的问题是开发人员的知识。 C++,尤其是在大量使用模板时,是一种比 C 复杂得多的语言。所以你需要一群非常优秀的开发人员。

但是,如果您想要一个干净且可重用的面向对象设计,C++ 无疑是比 C 更好的选择。