对于实时应用程序,哪个更好的C或C++?

6 c c++ comparison visual-c++

我是具有C语言和C++经验的电子工程师(我用C编写微控制器,用C++编写,用Borland C++ Builder编写的Windows)

我公司开发电机控制产品,我们正在使用STM32和IAR编译器.

我认识到语言之间的技术差异,我对开发海岸和代码的维护成本感兴趣:

  1. 编写C++代码的开发时间是否比C长?
  2. C++代码的维护成本是否比C便宜?(我知道代码总会有变化)
  3. 用C语言编写针对C的代码是否容易?(描述代码如何工作的文档)

Cha*_*via 17

这是非常主观的.我个人认为使用C++进行开发在开发时间和维护方面的成本较低,特别是对于大型复杂项目.这是因为我见过的大多数大型复杂C项目总是以这种或那种方式最终实现C++特性(例如多态).另外,我认为某些C++特性,如命名空间,数据封装和对象的自动初始化/破坏,增加了大型项目的可维护性; 虽然这些东西中的一些可以或多或少地被模仿到C中的不同程度的有效性.

但是,根据大量的其他因素,您的里程可能会有很大差异.例如,如果你的编程团队在使用C语言方面比C++有更多的经验,那么在C++中可能不值得这样做.

  • @earlz,我对这个论点持高度怀疑态度.像C一样,C++是一种强类型语言.任何阅读代码的人都可以轻松地确定`i`是一个`int`还是一个带有重载增量运算符的用户定义类.此外,相同的参数可以应用于C.是否`i ++`递增一个整数,或者它是否通过`sizeof(*i)`移动指针?你根本无法知道,除非你(喘息)知道这种类型,通过简单地浏览一下源代码就可以轻松确定. (11认同)
  • 就此而言,C中的`i ++`可能会调用浮点仿真库中的函数.与C++中用户定义的运算符重载的情况没有太大区别.好的,所以浮动仿真例程实际执行的工作量有一个上限,而在C++中,运算符重载的工作量没有上限.但在这两种情况下,如果编写良好的代码将执行尽可能多的工作,以后增加i,而不是更多.如果你不想做那么多工作,那么你就不能增加我. (6认同)
  • 同意.现在,C的好处主要在于生成小的可执行文件而且开销很小. (3认同)
  • 我会说C的好处是知道`i ++;`将执行一个'inc`指令(x86)而不会做一个涉及谁知道什么的大函数调用. (2认同)

Eri*_*lje 9

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

这完全取决于您的程序员.他们擅长写C或C++吗?

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

再次,将取决于您的程序员.您可以使用任何语言编写可维护或不可维护的代码.

用C语言编写针对C的代码是否容易?(描述代码如何工作的文档)

完全取决于您的团队和您正在使用的工具,但我想他们可能会大致相同.

总而言之,这一切都取决于你拥有的人和他们最擅长的人.如果你试图将一堆C程序员放在一个C++项目上,你可能会得到一些非常糟糕的C++.同样,如果你试图将一堆C++人员放在纯C项目上.


flo*_*rin 5

  1. 取决于所涉团队的经验.使用C++,您可以访问更丰富的库函数(但在嵌入它们时要小心它们的足迹).

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

  3. 文件的成本大致相同.


pae*_*bal 5

概括

如果有合适的 C++ 开发人员和编译器,请坚持使用 C++。

如果没有,那么您将必须平衡学习曲线、项目复杂性(这将通过语言适应性而减轻)和可用的编译器。

学习曲线

在 C 中,该语言的学习曲线更容易:您的开发人员将更容易掌握该语言的基本功能...C++ 是一种更大的语言,包含 C 子集、模板子集和对象子集等等,每个子集都与前一个子集有很大不同。

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

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

语言适应性

C说的很直白。要么使用 C 的内置构造,​​这会很容易(例如,将两个整数相加……),要么不使用,并且很容易出错,而且效率可能很低。

C++ 可以轻松避免资源泄漏、缓冲区溢出、内存或堆栈损坏。在 C 语言中,这些几乎可能发生在每一行代码中。

通过内联和封装,C++ 可以轻松高效、安全地处理任何类型(即用户定义类型)。借助模板和 OOP,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.
Run Code Online (Sandbox Code Playgroud)

无需记录此代码。每个人都知道什么是矩阵,什么是乘法。相同的 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...
}
Run Code Online (Sandbox Code Playgroud)

某些 C++ 语言功能在来自过程语言时甚至是不自然的,并且将成为学习曲线的一部分。如果开发人员没有做好准备,此类代码的编译器错误所产生的消息可能会破坏开发人员的理智。

:-)

因此,它再次取决于开发人员的 C++ 知识。

我个人的结论?

我一开始是一名 C 开发人员。在学习 C++ 后,我发现这门语言对我来说太复杂了,但我仍然认为 C++ 的一些功能在 C 中会很酷……从那时起,经过多年的经验,我的观点完全改变了。我再也不会用 C 语言编写代码了。

对我来说,没有任何意义:这就像限制自己骑自行车移动,而我可以选择使用自行车、汽车、飞机,甚至我的腿。

只要你的 C++ 编译器没问题,并且你的开发人员了解 C++(或者想学习 C++),C++ 就可以做 C 能做的一切(而且通常更好),甚至更多(记住,这是个人观点)。

Post Scriptum:C++ 是否用于关键应用程序?

显然,C++ 用于 F-35(“F-22 lite”)。以下文档很有趣,因为它显示了哪些 C++ 功能真正是零成本(因此具有积极影响),以及哪些 C++ 功能可能对软件产生负面影响:

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

如果 C++ 对于这架飞机来说足够好,那么我想 C++ 对于很多不太雄心勃勃的项目都有好处......

:-)