【问题标题】:Should I prefer array over vector for performance? [duplicate]我应该更喜欢数组而不是向量来提高性能吗? [复制]
【发布时间】:2012-07-24 19:10:20
【问题描述】:

可能重复:
std::vector is so much slower than plain arrays?

看起来向量是在堆而不是堆栈上分配的。

那么当性能成为一个严重问题时,我是否应该考虑使用数组来替换向量(如果可能)?

【问题讨论】:

  • 我认为这不会给您带来任何明显的改善。
  • 请参阅此问题stackoverflow.com/q/11648202/819272,了解有关 Howard Hinnant 的 STL 容器堆栈分配器的讨论。与std::vector 一起使用,这将使您的性能接近std::array(例如,在紧密的内部循环中使用时的性能接近10%),但如果堆栈缓冲区已满,它会通过进入堆来保持向量的灵活性。

标签: c++ arrays performance stl vector


【解决方案1】:

没有。 (为了满足评论学究,不,你不应该“更喜欢”数组而不是向量来提高性能,但可以肯定的是,对于下面列出的特定情况,你应该“考虑”使用数组来替换向量)

当性能成为一个严重问题时,您应该将优化基于实际数据,而不是二手故事、道听途说和迷信

如果用数组替换你的向量给你一个可衡量的(和必要的)加速,那么你应该这样做。

但请注意,您只能在以下情况下使用堆栈分配的数组:

  • 大小在编译时已知,并且
  • 大小足够小,可以放入堆栈而不会造成问题。
  • 大小必须是固定的,而不是动态的。

在大多数情况下,这些条件都不成立,然后数组无论如何都必须在堆上分配,然后你就失去了数组的一个优势。

但是如果所有这些条件都为真并且你可以看到这个堆分配实际上会显着地损害你的性能,那么是的,切换到一个数组(或@ 987654321@) 有道理。

不然呢?没有...

【讨论】:

  • 关于“在编译时知道大小”的部分并不完全正确,一些编译器支持运行时大小的数组的堆栈分配。 (事实上​​,C99 需要支持,但并非所有人都支持,因此 C11 将其设为可选)。
  • @Giel 问题是关于 C++ 的。 C++/C++11 标准不支持 VLA。
  • @Giel 但它不是标准 C++ 中的选项(尽管它可以作为 gcc 等编译器的扩展使用)。
  • 问题,“我是否应该考虑用数组替换向量”。答案:“不。如果用数组替换向量可以改善事情,你应该这样做”。这似乎是矛盾的——我如何才能在不至少考虑这种变化的情况下找出数组是否改进了事情?事实上,我很可能必须实际进行更改(在开发/测试环境中),以便了解有关它的任何信息。我想问题标题与问题文本的差异足以在这里造成混乱:我认为这个答案的想法是你应该考虑它,但不应该盲目地喜欢它。
【解决方案2】:

如果在编码时预先知道元素的数量,那么是的,您应该更喜欢使用数组。 C++11 提供了这个:

std::array<int,10000> arr;

但避免使用这个:

int arr[10000]; //avoid it in C++11 (strictly), and possibly in C++03 also!

在 C++03 中,在大多数情况下,您仍然应该更喜欢 std::vector(除非实验表明它很慢):

std::vector<int> arr;
arr.reserve(10000); //it is good if you know the (min) number of items!

在大多数情况下,当向量出现很慢时,这是因为程序员没有利用reserve()函数。相反,当向量调整自身大小时,它们依赖于重复分配-释放-复制策略。

【讨论】:

  • +1 表示编译时保证备注。请注意,std::array 不是std::vector 的直接替代品,因为它错过了push_back。这使得编写独立于容器的代码变得困难。
  • 堆栈上有 10000 个整数?真的吗?
  • @rhalbersma,大多数容器也不提供push_back。这不是std::array 的问题
  • @JonathanWakely 大多数序列容器(vectorlistdeque)都可以,std::arrayforward_list 除外。
  • @Jonathan:是的,例如在大规模多线程环境中,需要最小化线程开销。我不认为有 最小堆栈大小值,没有“太多堆栈”的可移植概念。如果您偏执,请不要将数组放在堆栈上。除非您确定它们比您正在使用的基本类型要小。
【解决方案3】:

除非您在异常系统上运行(即内存分配器速度较慢的系统),否则不太可能产生显着差异。我建议您更喜欢使用 std::vector 代替,因为它比普通数组更好的类型安全性。

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2010-12-30
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多