C++是否适用于小型嵌入式目标



我们目前正在重新设计嵌入式软件,并将从8位Cortex-M微控制器升级为32位Cortex-M。内存非常有限(128 kByte闪存和32 kByte RAM)。在另一个线程中,建议使用嵌入式软件库(www.redblocks.de)。它似乎很好地满足了我的需求,但需要使用C++。有人有在像我们这样的嵌入式平台上使用C++的经验吗?我想知道与C.相比,我正在处理什么样的开销。

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

以下是一些比较的功能:

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

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

然而,如果您想要一个干净且可重用的面向对象的设计,C++肯定是比C.更好的选择

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

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

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

更多信息请参阅本文或本页。

Scott Meyers的《嵌入式环境中的有效C++》一书也是一个很好的信息来源。

最新更新