C是否真的比C++更快?

4

起初,我认为由于C++是C的超集,因此C++不应该比C慢,但SO上很多人并不这样认为(链接)

C++比C慢是真的吗?如果不是,为什么还要使用C呢?


10
C++ 不是 C 的超集。 - missingfaktor
2
是的。我曾经看到C在4.3秒内完成40次,但一旦C++去掉了它的++,它也同样快。 - tidwall
2
你链接的答案明确表示这是一个谬论。那么这个问题有什么意义呢? - Konrad Rudolph
6
语言本身并不慢,实现方式才会导致速度较慢。C语言很简单,这使得它易于用一个快速的实现方式来保持一致的速度。C++具有同样的潜力(通常由于模板而超越C语言),但是需要更多的努力才能正确使用它。在现代编译器上,你很难找到运行缓慢的C++代码。即使你找到了,速度并不总是你主要关注的问题;事实上,应该是写得漂亮、清晰的工作程序。 - GManNickG
2
重复的问题:C++比C更快吗? - Brian R. Bondy
显示剩余3条评论
6个回答

14

C++不是C语言的超集。

两种语言都可以编写出同样高效或同样糟糕的程序。

争议可能来自于任何一门高级语言都拥有更多的高级特性可供使用,你很可能会使用它们。如果在低级语言中重新实现这些功能,则可能会表现得更差。但是,在低级语言中没有这些功能可能意味着您不太可能使用它们。

很可能您在任何一种语言中创建的程序都不会有什么区别。


4
另一方面,如果你在 C 语言中用函数指针数组来复制 C++ 的虚表,那么你在性能上并没有获得任何好处,而在简洁性上则是失去了。 - Eclipse
3
“this is slightly slower than not doing so”再次误导了读者:因为在需要的情况下使用诸如虚函数等特性很可能比手写代码而非编译器生成的等价代码更快 - Konrad Rudolph
1
你是否已经厌倦了说“C++不是C的超集”?你有宏设置吗? :) - torak
2
这是完全误导性的。使用C++的功能并说它们更慢只是问题的一半。您不能孤立地看待该功能,还必须查看在C中实现相同功能的成本。因此,在C/C++中等效的程序将是相同的。不幸的是,实现所有额外的功能,这些功能在C++中已经自动完成,您不太可能在C中以同样的效率实现该功能(因为编译器团队已经优化了10年)。 - Martin York
1
@Martin York:我的意思是,如果有更多的功能可用,你更有可能使用它。我不认为在C中重新实现相同的功能会更快。我同意你的观点。 - Brian R. Bondy
@Martin York:我现在重新表达了我的意图,措辞更好了。 - Brian R. Bondy

9
你是否意识到"C++比C慢"是一个谬论,实际上应该是说"C++不比C慢"? 对答案的那个评论并不是很严肃。
“C++比C慢是真的吗?如果不是,为什么还要使用C呢?”
“一辆法拉利比福特慢是真的吗?如果不是,为什么还要使用福特呢?”

3

编程语言本身并没有速度可比性。我想你想问的是使用C编译器编译的代码是否比使用C++编译器编译的代码更快。答案是...取决于你比较哪些编译器以及被编译的代码的性质。


1

我认为你所指的“慢/快”在这里并不存在。

C/C++都是具有自己编译器的编程语言。每种语言都会以某种方式将您的程序转换为较低级别的语言。您可能会发现两者之间存在大量差异,但它们实际上都归结于程序员的易用性。您不能仅因为一种语言比另一种语言晚出现就说它更快。这些不是发布的修复程序。这些是由新人以新风格创建的新编程语言。

如果你的理论继续下去...那么Java应该从世界上消除C++,C#应该从世界上消除Java...等等,不要忘了VB应该消除其他所有语言? :p 只是想让你知道你的问题的后果。


0
程序的速度更多地取决于程序员而不是语言。在金融服务行业(这不是一个容忍慢速代码的行业)中,C++是高性能应用程序的标准语言。如果C语言更快,它就会被使用。当然,开发速度和执行速度之间存在权衡。如果性能是唯一重要的因素,我们将始终编写100%的汇编代码。

-2

C++可以编写成C,因此不应该比C慢(假设编译器和库的优化水平相同)。

然而,如果以面向对象的方式编码,则速度应该会明显变慢。良好的面向对象代码将需要大量堆分配(否则您可以将大部分内容保留在堆栈上)和小空间分配 - 纯C可以在堆栈分配之外几乎不需要任何东西。此外,面向对象往往需要每个方法调用的额外一两个间接级别。


-1: 你应该多练习面向对象编程,是的,编写糟糕的C++代码可能会像你描述的那样,但是糟糕的编码并不是面向对象的要求。在对象的方法中编写应该在对象中的代码,并且额外的间接层会消失(是的,STL接口往往是糟糕编码的诱饵)。 - kriss
@kriss,实际上你的说法是错误的。编写不良的面向对象代码可能会很高效,而编写良好的面向对象代码通常不会。问题在于,代码最好是为人类最容易解析的方式编写的,而不是为机器。我碰巧喜欢面向对象,但除非你始终考虑性能而不是良好的设计,否则它将无法发挥出色的性能。如果您在编码时考虑性能,那么您做得不对-性能应该是您最后关心的问题。C++使这变得困难,这也是C++成为如此糟糕的面向对象语言的原因之一。 - Bill K
这是一个相当令人惊讶的说法。我的经验是,大量使用TDD和重构规则(编写规则使代码更简单、易于阅读和维护,而不是使其更快)也会使其更快。像传递复杂对象引用这样的规则可以减少参数数量,像使用本地方法这样的规则可以使代码更快等。实际上,我看不到任何重构规则会使代码变慢。另一方面,我曾经看到过盲目使用设计模式和过度工程化使代码变得更慢。但是,可能有必要就此问题展开讨论。 - kriss
@kriss 是的,但是良好的面向对象编程有许多小型短暂对象,而不是少量大型对象,并且没有所有权(与在堆栈上分配的对象相反)。如果您创建对象并将其传递,任何人都可能保留对它的引用或不保留--这不应该成为问题。在面向对象代码之外,我通常同意您之前的说法。我认为C++程序员在面向对象编程方面遇到很多麻烦,因为要做好面向对象编程与大多数C++实践相悖。大多数对象应该只有几个复杂的方法,每个方法都适合一页(非常粗略地说)。我很少在C++中看到这种情况。 - Bill K
@kriss 还有一个非常好的做法,就是尽可能使类变为不可变的 - 更多地是扔掉和重建,而不是重复使用(通常是)堆分配的内存。在几行代码中,Java 可以生成、修改、拆分和释放数十个字符串 - 但通常已将它们优化,以至于这实际上并不会对性能产生太大的影响 - 设计可以易读、可靠,您不必担心哪些可以返回(因为没有一个是栈分配的,全部都是堆分配的)。 - Bill K

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