为了账号安全,请及时绑定邮箱和手机立即绑定

在C+中使用数组或STD:向量,性能差距是什么?

在C+中使用数组或STD:向量,性能差距是什么?

C++ C
SMILET 2019-06-20 17:03:21
在C+中使用数组或STD:向量,性能差距是什么?在我们的C+课程中,他们建议不再在新项目中使用C+数组。据我所知,Stroustroup自己建议不要使用数组。但是有显著的性能差异吗?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

微优化人员的前导

记住:

“程序员会浪费大量的时间来思考或担心程序中非关键部分的速度,而这些提高效率的尝试在考虑调试和维护时实际上会产生很大的负面影响。我们应该忘记效率很小的问题,比如97%的时间:过早的优化是万恶之源。然而,我们不应在这个关键的3%中放弃我们的机会“。

(多亏了变态(全部报价)

不要使用C数组,而不是向量(或其他什么),因为你认为它更快,因为它应该是低级的。你就错了。

默认使用向量(或适合您的需要的安全容器),然后如果分析器认为这是一个问题,看看是否可以通过使用更好的算法或更改容器来优化它。

这就是说,我们可以回到原来的问题。

静态/动态阵列?

C+数组类比低级C数组表现得更好,因为它们对自己了解很多,并且能够回答C数组不能回答的问题。更重要的是,它们通常是使用模板和/或内联编写的,这意味着在调试中出现的大量代码解决了在发布版本中生成的很少或没有代码,这意味着与其内置的不太安全的竞争没有区别。

总而言之,它分为两类:

动态阵列

使用指向malloc ed/新ed数组的指针最多将与std:vectorv版本一样快,而且安全性要低得多(请参阅利特的职位).

所以使用std:载体。

静态阵列

使用静态数组最多是:

所以请使用STD:数组.

未初始化存储器

有时,使用vector而不是原始缓冲区会导致可见成本,因为vector将在构造时初始化缓冲区,而它替换的代码没有,正如所述伯尼在他的回答.

如果是这种情况,则可以使用unique_ptr而不是vector或者,如果代码线中的情况不例外,则实际上编写一个类。buffer_owner这将拥有该内存,并允许您轻松、安全地访问它,包括调整大小(使用realloc),或者任何你需要的东西。


查看完整回答
反对 回复 2019-06-20
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

矢量是罩下的数组。表演是一样的。

您可能会遇到性能问题的一个地方是,从一开始就没有正确地调整向量的大小。

当向量填充时,它将调整自身的大小,这可能意味着一个新的数组分配,后面是n个复制构造函数,然后是大约n个析构函数调用,然后是一个数组DELETE。

如果您的构造/析构是昂贵的,那么最好首先使向量具有正确的大小。

有一个简单的方法来证明这一点。创建一个简单的类,它在构造/销毁/复制/分配时显示。创建这些东西的向量,并开始将它们推到向量的后端。当向量被填充时,当向量调整大小时,就会出现一连串的活动。然后,使用大小为预期元素数的向量再试一次。你会看到区别的。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 641 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信