对于实时应用,使用C语言还是C++更好?

6
我是一名电子工程师,有使用C和C++的经验(我在微控制器上使用C编写代码,在Windows上使用Borland C++ Builder使用C++编写代码)。
我的公司开发电机控制产品,我们正在使用STM32和IAR编译器进行开发。
我了解这两种语言之间的技术差异,我关注代码开发成本和维护成本:
  1. 编写C++代码的开发时间是否比C长?
  2. C++代码的维护成本是否比C便宜?(我知道代码总会有变化)
  3. 在C++中编写代码文档是否比C容易?(描述代码如何工作的文档)

1
我会说这取决于情况。 我认为在嵌入式/微控制器平台上运行C++会更加困难,因为您必须在引导代码中拥有内存分配器以及处理虚函数的内容。但是一旦您将其启动并运行,我不知道它是否更难用于实时应用程序。 - Earlz
2
@earlz:我不认为这与C有任何不同。 - Martin York
@Martin:使用C语言,你唯一需要做的引导工作就是设置堆栈。不过,我说的只是关于语言本身的,而不是关于libc和所有那些类型的东西。 - Earlz
11个回答

17

这是非常主观的。我个人认为,对于大型、复杂的项目来说,在C++中开发花费的时间和维护成本要少得多。这是因为我见过的大部分复杂的C项目最终都会以某种方式实现C++的特性(例如多态性)。此外,我认为某些C++功能,如命名空间、数据封装和自动初始化/销毁对象等,可以增加大型项目的可维护性。虽然在C语言中,有一些类似的东西可以模拟出来,但效果有好坏之分。

但是您的情况可能会因为各种额外因素而有很大不同。例如,如果您的编程团队比较擅长C语言而不是C++,那么用C++可能并不值得。


3
同意。现在,使用C语言主要是为了生成体积小、开销少的可执行文件。 - Patrick Niedzielski
2
我认为使用C语言的好处在于,你知道i++;会执行一个inc指令(x86),而不是进行一个涉及各种操作的巨大函数调用。 - Earlz
11
@earlz,我对那个论点非常怀疑。C++和C一样,是一种强类型语言。任何人都可以轻而易举地通过阅读代码来确定i是一个int还是一个具有重载递增运算符的用户定义类。此外,同样的论点也可以应用于C语言。i++是否增加整数,或者将指针向上移动sizeof(*i)?除非您(惊讶)知道类型,否则您无法知道,而这可以通过简单地瞥一眼源代码稍微往上看就可以轻松确定类型。 - Charles Salvia
6
在C语言中,i++可能会调用一个浮点数仿真库中的函数。这与在C++中用户定义的运算符重载情况并没有太大区别。当然,在浮点仿真程序中,实际执行的工作量是有上限的,而在C++中,运算符重载所执行的工作量是没有上限的。但在两种情况下,只要代码写得好,就会完成必要的工作来进行后置增量操作,不会做过多的无用工作。如果您不想做那么多的工作,那么就不能对i进行递增。 - Steve Jessop

9
写C++代码的开发时间是否比写C代码的时间长?这完全取决于你的程序员。他们更擅长写C还是C++?
C++代码的维护成本是否比C代码更便宜?(我知道代码总会有变化)同样,这取决于你的程序员。在任何语言中,你都可以编写易于维护或不易于维护的代码。
相对于C语言,C++语言中的代码文档是否更容易编写?(描述代码工作方式的文档)这完全取决于你的团队和所使用的工具,但我认为它们可能会差不多。
因此,总结起来,一切都取决于你拥有的人才以及他们最擅长什么。如果你试图将一群C程序员放在一个C++项目中,你可能最终会得到一些非常糟糕的C++代码。同样,如果你试图将一群C++程序员放在一个纯C项目中,情况也是如此。

5
  1. 团队经验决定了选择哪种语言。使用C++可以获得更丰富的库函数(但在嵌入式系统中要小心它们的占用空间)。

  2. 设计良好的C++代码比C代码更易于维护,因为它允许一些语法糖(构造函数、析构函数、RAII)。

  3. 文档编写成本大致相同。


4

摘要

如果有合适的C++开发者和编译器,那么应该坚持使用C++。

如果没有,那么你需要平衡学习曲线、项目复杂性(语言的适应性将会减轻它)和可用的编译器。

学习曲线

C语言的学习曲线较为简单:你的开发者更容易掌握语言的基本特征... C++是一种更大的语言,包含了C子集、模板子集、对象子集等,每个子集都与前一个子集非常不同。

事实上,用C++编写非常低效的代码是很容易的。这不是因为“语言很慢”,而是因为开发者有时会以错误的方式编写代码(通常是忽略C++语言中的非C部分,如引用等)。这是“学习曲线”问题的一部分。

但是一旦“学习曲线”结束,我们就可以看看语言的特点...

语言的适应性

C语言相当直白。要么使用C的内置结构,这很容易(比如,添加两个整数...),要么不使用,那么就会出现错误,并且可能效率低下。

C++使避免资源泄漏、缓冲区溢出、内存或堆栈破坏变得容易。在C语言中,这些问题几乎会在每一行代码中发生。

通过内联和封装,C++使得可以高效安全地使用任何类型(即用户定义的类型)。通过模板和面向对象编程,C++可以非常轻松地向某个类型添加额外的功能。

当然,所有这些都是基于C和C++将具有同等有效的编译器......

编译器

C++对编译器做了很多假设。通过阅读STL实现,您将看到许多明显无用的函数调用,并会对所有这些“花哨”的成本感到惊讶。事实是,编译器将把这些内容内联,使得最终的二进制文件比您想象的要小。

但是,如果您的编译器不能够这样做,那么C++可能不是一个好主意。

结论

1-编写C++代码的开发时间是否比C更长?

这取决于项目的大小/复杂性以及开发人员对所选择语言的熟悉程度。如果您有C++开发人员,请坚持使用C++

2 - C++代码的维护成本是否比C更便宜?(我知道代码总是会有变化)

同样,这取决于项目的大小/复杂度。它越复杂,您需要的架构就越多,因此您需要更多支持语言功能,然后使用C++。

3 - 在C++中撰写代码文档是否比C容易?(描述代码运行方式的文档)

我假设你谈论的是代码清晰度(即不是类似于Doxygen的文档,对C和C++都起相同作用)。

这取决于您使用的特性有多少。例如,使用C ++字符串与C中等效代码相比非常自然。事实上,在C ++中使用复杂结构比在C中更容易...

MyMatrix A, B, C ; // My Matrix is an user-defined object
// etc.
C = A * B ;        // If you believe this is anything but a
                   // multiplication of two matrices, then
                   // you need serious medical help.

没有必要对这段代码进行文档记录。每个人都知道矩阵和乘法是什么。如果是 C 语言,同样的代码会更加冗长...

但是,C++ 也可能非常冗长。如果没有 foreach(例如 Boost.FOREACH),编写循环以迭代 STL 容器中的每个项目可能会相当令人印象深刻:

for(std::map<int, std::string>::iterator it = myMap.begin(), itEnd = myMap.end() ;
    it != itEnd ;
    ++it)
{
   // Do something quite complicated...
}

一些C++语言特性即使从过程式语言转换而来,也是非常不自然的,这将成为学习曲线的一部分。如果开发人员没有准备好,这种代码导致的编译器错误信息可能会让他们崩溃。
:-)
所以,这又取决于您的开发人员对C++的了解程度。
我的个人结论?
我开始作为一个C开发者。在学习了C++之后,我发现这种语言对我的使用来说太复杂了,但是,我认为一些C++特性在C中会很酷……此后,经过多年的经验,我的观点完全改变了。我再也不会编写C代码了。
对我来说,没有意义:这就像限制自己只能用自行车移动,而我可以选择使用自行车、汽车、飞机甚至是我的腿。
只要您的C++编译器正常,您的开发人员了解C++(或想学习C++),C++可以做到C所能做到的一切(通常更好)并且还有更多功能(请记住,这是个人观点)。
附言:C++用于关键应用程序吗?
显然,C ++ 在 F-35(“F-22 lite”)中使用。以下文档很有趣,因为它显示了哪些 C++ 特性真正是零成本的(因此具有积极影响),以及哪些 C++ 特性可能对软件产生负面影响:

http://www.stroustrup.com/JSF-AV-rules.pdf

如果C++足够好以this plane为例,那么我想C++对于许多不那么雄心勃勃的项目也是很好的选择... :-)

3
选择已知的恶意
如果你或你的商店在C和C++方面的经验相差很大,那么就坚持使用C。我不会轻易在关键任务项目中引入新技术。大多数时候,开发人员的资格比你的工具集更重要,对项目成功更有帮助。
选择更好的工具集
在许多微控制器上,编译器技术落后于消费者桌面平台五到十年。一个好的编译器将使您不再担心微观优化,配备一个体面的分析器(已准备就绪),您可以跳过很多猜测和自定义测量。
......它是如何使用的
其他条件相等时,不是语言的选择,而是如何使用它。 C++的性能问题相当有限:
- 可用的功能也意味着您可能会不正确地使用更多的功能。有一种诱惑力,就是因为它们听起来很酷,那有什么问题吗? - 一些更多的事情需要了解相对/绝对成本(例如成员函数调用、虚拟调用、异常等) - 一段代码可以根据其他代码有更多不同的含义,因此某些性能影响并不像在C中那样快速可见。
所有这些观点都是关于开发人员,而不是语言本身。

2
你提到了readtime这个词,我理解为你非常注重性能。在这一点上,我可以说C++与C相比不会降低性能,并且C++可以并且正在被用于操作系统内核(如Symbian)。
然而,C++确实提供了可能会降低性能的惯用法。Getter和Setter可能会导致额外的代码生成。与C代码相比,虚表查找将需要更多的指令。
在可维护性方面,我们还需要考虑到系统程序员可能比C++更熟悉C。

1

语言选择与你所提出的三个问题几乎没有关系。选择你更有经验的语言,并且能够让你更加表达自如。


1

其实,两者都没有明显的优势。更多的是关于你如何使用它,而不是你使用的具体内容。

具体回答:

  1. 不,这通常取决于开发人员对语言的熟练程度。如果他/她更熟悉C语言,那么他将比C++更快地编写C代码(反之亦然)。
  2. 与上面的答案相同。维护工作与最初编写的代码质量以及有时文档质量一样重要。
  3. 两种语言的文档语法完全相同。

1

由于更强的数据类型和对象约束,你应该绝对使用C++ :)


0

我认为你提到的这三个点都取决于工具支持。 由于C++更难解析,而且静态分析也更难,因此可能只有一些工具适用于C。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接