[英]For real-time application, which is better C or C++?
我是具有C语言和C ++经验的电子工程师(我用C编写微控制器,用C ++编写,用Borland C ++ Builder编写的Windows)
我公司开发电机控制产品,我们正在使用STM32和IAR编译器。
我认识到语言之间的技术差异,我对开发海岸和代码的维护成本感兴趣:
这是非常主观的。 我个人认为使用C ++进行开发在开发时间和维护方面的成本较低,特别是对于大型复杂项目。 这是因为我见过的大多数大型复杂C项目总是以这种或那种方式最终实现C ++特性(例如多态)。 另外,我认为某些C ++特性,如命名空间,数据封装和对象的自动初始化/破坏,增加了大型项目的可维护性; 虽然这些东西中的一些可以或多或少地被模仿到C中的不同程度的有效性。
但是,根据大量的其他因素,您的里程可能会有很大差异。 例如,如果你的编程团队在使用C语言方面比C ++有更多的经验,那么在C ++中可能不值得这样做。
编写C ++代码的开发时间是否比C长?
这完全取决于您的程序员。 他们擅长写C或C ++吗?
C ++代码的维护成本是否比C便宜? (我知道代码总会有变化)
再次,将取决于您的程序员。 您可以使用任何语言编写可维护或不可维护的代码。
用C语言编写针对C的代码是否容易? (描述代码如何工作的文档)
完全取决于您的团队和您正在使用的工具,但我想他们可能会大致相同。
总而言之,这一切都取决于你拥有的人和他们最擅长的人。 如果你试图将一堆C程序员放在一个C ++项目上,你可能会得到一些非常糟糕的C ++。 同样,如果你试图将一堆C ++人员放在纯C项目上。
取决于所涉团队的经验。 使用C ++,您可以访问更丰富的库函数(但在嵌入它们时要小心它们的足迹)。
精心设计的C ++代码比C代码更容易维护,因为它允许一些语法糖(构造函数,析构函数,RAII)。
文件的成本大致相同。
如果可以使用体面的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的代码是否容易? (描述代码如何工作的文档)
这取决于您使用的功能。 例如,与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 ++用于F-35(“F-22 lite”)。 以下文档很有意思,因为它显示了C ++的功能实际上是零成本(因此产生了积极的影响),以及C ++的哪些功能可能对软件产生负面影响:
http://www.stroustrup.com/JSF-AV-rules.pdf
如果C ++足够好用于这个平面 ,那么我猜C ++对很多不那么雄心勃勃的项目都有好处......
:-)
选择已知的邪恶
如果您/您的商店在使用C方面比使用C ++有更多的经验,请坚持使用C.我不会轻易地在关键任务项目中引入新技术。 大多数时候,开发人员的资格对于项目成功而言比工具集更重要。
选择更好的工具集
在许多微控制器上,编译器技术落后于消费者桌面平台五到十年。 一个好的编译器会让你不再担心微优化,有了一个不错的分析器(已经准备好并配备了武器),你可以跳过大量的猜测和自定义测量。
......这就是你如何使用它
在其他条件相同的情况下,这不是语言的选择,而是你如何使用它。 C ++的性能问题非常有限:
所有这些都是关于开发人员的,而不是语言本身。
你提到了readtime这个词,我理解这意味着性能对你很重要。 在这一点上,我可以说,与C和C ++相比,C ++不会产生性能损失,并且可以在操作系统内核(Symbian)中使用。
但是,C ++会提供可降低性能的习惯用法。 Getter和Setter可能会导致生成额外的代码。 与C代码相比,Vtable查找需要一些额外的指令。
在可维护性方面,还需要记住,系统程序员可能会更熟悉C,然后他们会使用C ++。
语言选择与你提出的三个问题关系不大。 选择您更有经验的语言,这样可以让您更具表现力。
真的,两者都没有特定的优势。 它更多地是关于你如何使用它而不是你正在使用的。
具体答案:
由于更强大的数据类型和对象约束,你绝对应该使用C ++ :)
我认为你提到的所有三点都取决于工具支持。 由于C ++更难以解析并且更难以静态分析,因此可能有些工具仅适用于C.
- 编写C ++代码的开发时间是否比C长?
有时。 有些实时应用程序根本无法在C ++中实现。
- C ++代码的维护成本是否比C便宜? (我知道代码总会有变化)
不,这是应用敏感的。
- 用C语言编写针对C的代码是否容易? (描述代码如何工作的文档)
一般来说它们相当。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.