什么事(或在何种情况下),可以比C使C ++慢?(What things (or in what c

2019-07-29 14:06发布

这是一个面试问题,面试已经完成。

什么东西可以使C比C ++慢?

面试官问它很深,总是问:“什么事吗?”每当我说了些什么。

我的想法:

C ++功能无法在C语言中可能有一定的成本。

举例来说,如果我们使用赋值来初始化类的成员在构造函数中没有初始化列表,成员的默认构造函数可一旦构造函数体之前调用,然后该值被分配一扫而光。

虚函数需要通过搜索虚函数指针调用。 这是一个开销。

任何更好的想法?

任何帮助将不胜感激。

谢谢 !!!

Answer 1:

没有。 事实上,C ++比C快曾经比较std::sortqsort

人们说,虚函数花费时间打电话。 他们是这样。 但这样做的C相当于一个虚函数表查找。 如果您在两种语言编写等价逻辑,C ++版本会更容易维护,更清洁,更快捷。

编辑:哦,是的,你可以调用printf从C ++,如果你想,或者完全如果你想重新做流实现。

而我提到的程序,由于其崩溃到放错位置的NULL终止的表现还算无关紧要?

宏和内联函数会“膨胀”是C可执行文件一样肯定为模板,将在C ++。



Answer 2:

有什么本质上慢大约C ++与C'S,不过,地道的C ++代码往往是很多比惯用的C代码做同样的任务更慢和更重。 惯用的这个词是这里的关键; 如果你写你的C代码来执行任务正是你所执行的C ++该任务以同样的方式,这将是一样缓慢。 在另一方面,如果你知道其中的隐含费用一般用C攀升++,你可以作出努力,让他们最小的,并得到C的好处++没有尽可能多的费用。

首先是动态内存分配。 在C语言中,你看你做的动态内存分配的每一位,因为这一切都明确的(无论是在以电话形式malloc其返回分配的对象或调用第三方的库函数)。 在C ++中,在对象的存储时间是自动的许多类的对象仍然会招致动态内存分配,由于隐藏的分配发生在它们的构造。 一个很好的C ++ STL(或第三方库)的实现可以通过包括小缓冲区对象内部本身,而只需要一个大的缓冲区时进行动态分配,避免了不少这样的成本,却很少做到这一点在实践中。 (如果我没有记错的话,LLVM的libc中++做,但海合会的libstdc ++没有。),因为这是实现问题的质量那是经常的自己的代码的控制之外,你可以在这里做的影响降到最低,主要就是要意识到自动分配对象的动态存储器,和避免(例如,通过尽可能使用指针或引用)创造了超过需要的可能性。 这有你的代码其他的好处。

另一大领域是字符串处理。 在惯用的C,字符串与一举构造snprintf或相似。 在C ++和字符串的具有更强大的字符串类/类型,级联(由式结构件)许多其他语言是惯用的。 这是非常低效的,从而导致多个分配/解除分配步骤,副本等更不用说所得存储器碎片。 我不知道C ++的最佳实践将涉及什么(我不是很精通C ++),但应该有办法尽量减少这种影响。

而最普遍的,当然,隐藏的代码。 这是那种一个包罗万象的。 这很容易在C ++中,其中很多额外的代码,你永远也看不到被执行编写代码。 构造函数/析构函数,重载运算符和模板是最显而易见的原因。 同样,如果你想要做的东西 C 同样的方式 ,成本是一样的,但不同的是,在C,你成本就因为你必须自己编写。



Answer 3:

哇......很多问题的答案对C ++的爱,所以我会咆哮有点作为魔鬼代言人。

在原子尺度的语言,我会同意,很少或几乎没有在本质上是显著“慢”用C ++执行。 在较高的水平,它得到的复杂。 C ++是一个有用的工具,但往往是华丽不停地谈论不适当地作为用于所有问题的解决方案。 这是最好的时候,我们用最简单的语言来描述一个问题,有时这是C ++其他时间...组装,操作码,解释型语言。

C ++依赖更大程度上的编译器来“解释”的意图,通过模板,类,宏等,以多次迭代多层次爬行。 通过翻译每个环都有遭遇潜在的意外后果定律 。 据我所知,处理器没有寄存器或操作码的是本地处理的构建体C ++有,所以每个必须被分解为一个简化的部分。 在这方面,编译器和代码标准是国王。 在某些情况下,这是一个教师的哲学等同与PHD在数学(编译)教三年级学生(处理器)。

我喜欢C ++和保守的使用它,但我很少见到它多年来写得好。 我想迫使一些看最终由构建反刍汇编或机器代码,直到他们明白它是如何错综复杂可以。 坏C是一个东西,坏的C ++可以成倍加重。

以下为访谈更好的答案......“当你将小组成员查看C ++不回答这个问题?”



Answer 4:

用C大多数特征++是一个溶液用C来解决(潜在的)问题(例如:构造,以确保创建的数据束的有效性( struct C)中

这意味着,用C来写一个正确的纲领,试图避免其中有一个C ++的功能出了问题,你将不得不执行C ++是做幕后类似的行动。 这导致在这两种情况下性能相似。

当然,你可以写是“更快”马虎计划,但不会在所有情况下正常工作



Answer 5:

C已restrict ,C ++不,虽然大多数编译器拥有它作为一个扩展。

还有其中C ++不具有可变长度数组。



Answer 6:

任何更好的想法? 任何帮助将不胜感激。

在C ++中STL因此是很少比C的特殊编码等效较慢但是,STL的便利性有时会导致一个写慢的代码。 例如,假设一组固定的100个项目外面的10或15的可变做出选择。 假设一个程序的时间关键循环问很多次是否项目i已经被选择。 快速数据结构,以支持这样的时间关键环路将是100级的bool的阵列(或载体等)。 然而,来填充std::set<size_t>可能用C更容易代码++比来填充所述阵列。 C ++的程序员可能更喜欢的一套数组这个原因了。

当然,慢的代码是否是一个问题依赖于时间紧迫的循环将多少服务见。 如果需要额外的半小时到阵列技术进行编程,并且在该程序的生命总节约执行时间是0.5秒,该组的技术是可能优选的。 在另一方面,如果总的节约执行时间是30天,然后在阵列技术可以是优选的。

沿着这些线路很多类似的答案可能会得到。 祝你的采访。



Answer 7:

先验的不是性能问题,但LLVM代码库既不使用也不RTTI例外,因为它们被认为是在代码大小方面过于昂贵 。



文章来源: What things (or in what cases) can make C++ slower than C ?