【问题标题】:c++ std::vector performance [reference required]c++ std::vector 性能[需要参考]
【发布时间】:2010-11-25 21:12:36
【问题描述】:

我正在编写一些数据结构的并行实现。我想知道是否有人知道纯指针和 std::vector 之间的性能差异。如果您知道有关它的可靠文档,请写 URL/书名/随便什么。欢迎任何提示!

【问题讨论】:

  • 指针和std::vector有什么共同点?
  • 不幸的是,我对此一无所知,但是 +1 是一个非常好的,可能是非常常见的问题 :-)
  • 两者都可以存储任何类型的数据。我问是因为我不知道哪个更快。
  • 我认为“纯指针”是指手工制作的动态分配数组?
  • @Adam:不,他们不能保存“任何类型的数据”。可以容纳 same 类型的 n>=0 对象。你到底是什么意思?

标签: c++ stl vector


【解决方案1】:

区别在于用法实现相对。

【讨论】:

  • +1: std::vector<> 只是一个友好动态分配的数组。
  • 我在“历史”中“隐藏”了这个答案的发展,但最初的句子对我们大多数人来说应该足够了。
【解决方案2】:

您可以通过使用未检查的 operator[] 并适当地调整大小来使 std::vector 与普通指针一样快。现实情况是,vector 是指针上的编译时抽象——而不是运行时抽象,除非您选择使用 extras。更重要的是大大增加了安全向量功能——调试迭代器、自动和安全的资源管理等。没有理由使用原始指针。

编辑:我的参考是您在考虑失去向量的安全性之前进行的分析运行。

【讨论】:

    【解决方案3】:

    根据this answer in a similar question,访问动态分配数组中的元素与std::vector 将大致相同。在那个问题和this one as well 中有一些很好的分析。

    【讨论】:

      【解决方案4】:

      如果您打算将 std::vector 与一些手写的动态数组进行比较,这里有一些参考点:

      • 插入时调整大小的因素很重要。该系数未在标准中指定,但通常介于 1.5 或 2 之间,并且必须保证插入操作的摊销恒定时间。
      • 分配器:很多性能取决于所使用的分配机制,指针也是如此。
      • 如果您调用 vector::at,则可以在 std::vector 中进行边界检查,而原始指针则无法进行。

      【讨论】:

      • 如果您要进行苹果对苹果的比较,则调整大小的因素无关紧要。必须预先调整原始数组的大小,因此您可能会对 vector 做同样的事情。
      • @jalf:目前还不清楚“纯指针”是什么意思,所以它更像是一个苹果与一些未指定的水果在一个锁定的盒子比较。
      • @jalf:我想如果他将某些东西与vector 进行比较,动态调整大小是必须的。如果他不需要动态调整大小,无论如何他都应该使用std::array
      猜你喜欢
      • 2018-06-06
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多