【问题标题】:For real-time application, which is better C or C++?对于实时应用程序,C 或 C++ 哪个更好?
【发布时间】:2009-12-18 15:16:31
【问题描述】:

我是一名电子工程师,同时使用 C 和 C++ 语言(我使用 C 编写微控制器,使用 C++ 编写 Windows 使用 Borland C++ Builder)

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

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

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

【问题讨论】:

  • 我会说 这取决于。 我会说在嵌入式/微控制器平台上启动和运行 C++ 会更加困难,因为您必须在引导程序中有一个内存分配器代码,以及处理虚函数的东西(如果您使用它们)。不过,一旦你启动并运行它,我不知道它是否更难用于实时的东西。
  • @earlz:我看不出这与 C 有何不同。
  • @Martin:使用 C 语言,您必须做的唯一引导就是设置堆栈。我只是在谈论语言,而不是关于 libc 和所有类型的东西

标签: c++ c comparison visual-c++


【解决方案1】:

这是非常主观的。我个人认为使用 C++ 进行开发在开发时间和维护方面的成本更低,尤其是对于大型、复杂的项目。这是因为我见过的大多数大型、复杂的 C 项目总是以一种或另一种方式实现 C++ 特性(例如多态性)。此外,我认为某些 C++ 特性,例如命名空间、数据封装和对象的自动初始化/销毁,增加了大型项目的可维护性;尽管这些东西中的一些在 C 语言中或多或少地被效仿到不同程度的效果。

但您的里程数可能会有很大差异,这取决于大量其他因素。例如,如果您的编程团队在 C 方面的经验比在 C++ 方面的经验更多,那么在 C++ 中可能不值得这样做。

【讨论】:

  • 同意。现在,C 语言的好处主要在于以很少的开销生成小型可执行文件。
  • 我会说 C 的好处是知道 i++; 将执行 inc 指令(x86)并且不会执行涉及谁知道什么的巨大函数调用。
  • @earlz,我对这个论点持高度怀疑态度。 C++ 和 C 一样,是一种强类型语言。任何阅读代码的人都可以轻松确定 iint 还是带有重载增量运算符的用户定义类。此外,同样的论点可以应用于 C。i++ 是增加一个整数,还是将指针向上移动sizeof(*i)?除非您(喘气)知道类型,否则您根本无法知道,这很容易通过进一步查看源代码来确定。
  • 就此而言,C 中的i++ 可能会调用浮点仿真库中的函数。与 C++ 中用户定义的运算符重载的情况没有太大区别。好的,所以浮动仿真例程实际执行的工作量有一个上限,而在 C++ 中,运算符重载可以执行的工作量没有上限。但是在这两种情况下,如果编写得好,代码将完成后增量 i 所需的工作,仅此而已。如果你不想做那么多工作,那么你就不能增加 i。
【解决方案2】:

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

这完全取决于您的程序员。他们更擅长编写 C 还是 C++?

C++代码的维护成本是 比C便宜吗? (我知道总是 将在代码中进行更改)

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

用 C++ 记录代码是否容易 反对 C? (描述的文件 代码是如何工作的)

完全取决于您的团队和您使用的工具,但我想说它们可能大致相同。

因此,总而言之,这完全取决于您拥有的人以及他们最擅长的事情。如果你试图让一群 C 程序员参与一个 C++ 项目,你最终可能会得到一些非常糟糕的 C++。同样,如果您尝试将一堆 C++ 人员放在一个纯 C 项目中。

【讨论】:

    【解决方案3】:
    1. 取决于相关团队的经验。使用 C++,您可以访问更丰富的库函数集(但在嵌入它们时要小心它们的占用空间)。

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

    3. 文档成本大致相同。

    【讨论】:

      【解决方案4】:

      总结

      如果有不错的 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.
      

      无需记录此代码。每个人都知道什么是矩阵,什么是乘法。 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 能做的所有事情(通常更好),甚至更多(记住,这是个人观点)。

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

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

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

      如果 C++ 对this plane 来说足够好,那么我猜 C++ 对很多不那么雄心勃勃的项目也有好处...

      :-)

      【讨论】:

        【解决方案5】:

        选择已知的邪恶
        如果您/您的商店使用 C 的经验比使用 C++ 的经验多得多,请坚持使用 C。我不会轻易在关键任务项目中引入新技术。大多数时候,开发人员的资格对于项目的成功比您的工具集更重要。

        选择更好的工具集
        在许多微控制器上,编译器技术落后于消费桌面平台五到十年。一个好的编译器会让你不再担心微优化,使用一个体面的分析器(准备好并武装)你可以跳过很多猜测和自定义测量。

        ...这就是你如何使用它
        在其他条件相同的情况下,这不是语言的选择,而是你如何使用它。 C++ 的性能问题非常有限:

        • 可用的更多功能也意味着您可能会错误地使用更多功能。有一种使用它们的诱惑,因为它们听起来很酷,而且会出现什么问题?
        • 还有一些需要了解的相对/绝对成本(例如成员函数调用、虚拟调用、异常......)
        • 一段代码可能具有更多不同的含义,具体取决于其他代码,因此某些性能影响不像在 C 中那样快速可见。

        所有这些要点都与开发人员有关,而不是语言本身。

        【讨论】:

          【解决方案6】:

          您提到了 readtime 这个词,我理解这意味着性能对您来说至关重要。在这一点上,我可以说,与 C 相比,C++ 不会对性能造成影响,并且 C++ 可以并且用于操作系统内核 (Symbian)。

          但是,C++ 确实提供了会降低性能的习语。 Getter 和 Setter 可能会导致产生额外的代码。与 C 代码相比,Vtable 查找需要一些额外的指令。

          在可维护性方面,还需要记住,系统程序员可能会更熟悉 C 而不是 C++。

          【讨论】:

            【解决方案7】:

            语言选择与您提出的三个问题几乎没有关系。选择您更有经验的语言,并让您更有表现力。

            【讨论】:

              【解决方案8】:

              两者都没有特定的优势,真的。更多的是关于你如何使用它,而不是你正在使用什么。

              具体答案:

              1. 不,这通常取决于 开发人员的经验水平 语言。如果他/她更多 对 C 感到舒服,那么他会 编写 C 比 C++ 更快(并且 反之亦然)。
              2. 与上述答案相同。维护同样重要 最初的代码质量 书面,有时是质量 文档。
              3. 两种语言的文档语法完全相同。

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

                  我认为您提到的所有三点都取决于工具支持。 由于 C++ 更难解析,也更难静态分析,可能是某些工具仅适用于 C。

                  【讨论】:

                    【解决方案11】:
                    1. 写C++代码的开发时间比C长吗?

                    有时。有些实时应用程序根本无法用 C++ 实现。

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

                    没有。它对应用程序敏感。

                    1. 在 C++ 中针对 C 编写代码是否容易? (描述代码如何工作的文档)

                    一般来说它们是等价的。

                    【讨论】:

                    • 不确定我是否相信您的第一条评论。我能想到 C 做的任何我在 C++ 中做不到的事情
                    • 你不能相信 C++ 编译器生成的代码是确定的代码。
                    猜你喜欢
                    • 1970-01-01
                    • 2015-02-23
                    • 1970-01-01
                    • 2014-12-07
                    • 2016-12-20
                    • 2011-04-15
                    • 1970-01-01
                    • 2017-10-17
                    • 2011-01-22
                    相关资源
                    最近更新 更多