嵌入式系统的面向对象是不好的,为什么?

coo*_*per 15 c c++ embedded

许多嵌入式工程师使用c ++,但有些人认为它很糟糕,因为它是"面向对象的"?

面向对象是否真的对嵌入式系统有害,如果是这样,那为什么会这样呢?

编辑:这里有一个快速参考,询问:

所以我们希望人们不要使用除...,malloc ......,或其他带有大额惩罚的面向对象的练习.

我想问题是嵌入式系统环境中被认为是重量级的对象?这里的一些答案表明他们是,有些人认为他们不是.

Jos*_*phH 14

虽然我不确定它是否回答了你的问题,但我可以总结出我之前公司源代码纯粹的原因.

首先值得总结一下情况:

  • 我们希望编写大量的"核心"代码,这些代码可以在大量ARM嵌入式系统(大多数是中端手机;智能手机和运行不同年龄的RTOS的手机)中高度移植
  • 平台通常有一个可行的C编译器,但有些例如不支持浮点"双".
  • 在某些情况下,平台有一个合理的标准库实现,但在许多情况下它没有.
  • 在大多数平台上都没有C++编译器,并且它可用于支持C++标准库,STL或异常变化很大.
  • 调试器通常不可用(你可以发送调试printfs的串口被认为是奢侈品)
  • 我们总是可以访问合理数量的内存,但往往没有合理的malloc()实现

鉴于此,我们完全使用C语言,甚至只使用了一组受限制的C 89.结果代码具有高度可移植性.我们经常使用面向对象的概念.

这些天"嵌入式"是一个非常广泛的定义.它涵盖了从没有RAM或C编译器的8位微处理器到基本上高端PC(尽管没有运行Microsoft Windows)的所有内容 - 我不知道您的项目/公司在该范围内的位置.


Ale*_*x B 13

从表面上看,动态内存分配与面向对象的软件设计是完全独立的概念,因此它是完全错误的.您可以使用面向对象的设计,而不是使用动态内存分配.

实际上,您可以在一定程度上在C中执行OO(这就是Linux内核所做的).许多嵌入式开发人员不喜欢C++ 的真正原因是它非常复杂,很难在其中编写直接且可预测的代码.Linus 最近对他为什么不喜欢C++ 有一个很好的咆哮(我保证,它比的更好,更合理).可能大多数人都没有很清楚地表达出来.

  • IMO不难在C++中编写直接/可预测的代码.真正的问题是,在C++中编写不可预测的代码非常容易,而在C语言中却很难(如果你在C语言中滥用预处理器它很容易......) (4认同)
  • @smerlin:说得好。糟糕的程序员在任何语言中都会产生糟糕的结果。 (2认同)
  • 我非常喜欢那个帖子中的几个帖子.在我看来,确实如此,例如,c ++的pass-by-reference通常是非常不适用的,并且实际上并不比指针"更安全".后者对呼叫者来说真的要清楚得多.而且我也同意他关于规范更加清晰和C的看法,以及一些C++"专家"建议使用模板进行任何和所有事情,因此它更"通用" - 也不喜欢. (2认同)

Ara*_*ion 7

是什么让你说C++是面向对象的?C++是多范式的,并非由于其开销,C++提供的所有功能对嵌入式市场都很有用.(所以......只是不要使用这些功能!问题解决了!)


Tho*_*ews 5

面向对象非常适合嵌入式系统。它着重于封装,数据隐藏和代码共享。一个人可以拥有面向对象的嵌入式系统,而无需划分或动态分配内存。

无论面向对象,面向数据还是程序编程,分区和动态内存分配都是嵌入式系统的敌人。这些概念可能会或可能不会在面向对象设计的实现中使用。

面向对象允许UART类在不知道消息对象内容的情况下发送消息对象实例。消息可以是基类,并且可以具有几个后代类。

C ++语言允许通过构造函数,复制构造函数和析构函数来促进嵌入式系统中的安全编码,而这些构造函数只能在训练有素的C语言嵌入式系统中记住。

异常处理也是使用C语言工作的痛苦。C ++提供了嵌入到该语言中的更好的功能。

C ++语言提供了用于编写通用代码以处理不同数据类型的模板。一个典型的例子是环形缓冲区或循环队列。在C语言中,必须使用“指针使之无效”,以便可以传递任何对象。C ++提供了一个模板,因此可以编写一个Circular_Queue类,该类适用于不同的数据类型并具有更好的编译时类型检查。

继承允许更好的代码共享。共享的代码被分解为基类,并且可以创建共享相同功能的子类。通过继承。

C语言提供函数指针。C ++语言为函数对象(带有属性的函数指针)提供了便利。

抱歉,我只是不喜欢那些因为谣言以及对C ++的了解和经验很少而将嵌入式系统限制为C语言的人。