【问题标题】:C++: Large dynamic array of structs that rarely changes size, Is Vector necessary?C ++:很少改变大小的大型动态结构数组,Vector 是否必要?
【发布时间】:2015-07-01 09:23:28
【问题描述】:

我有许多大型结构数组,数组的大小很少会改变最大大小,当它改变时,它是可以接受的。

我想我应该有一个大的分配块,我可以继续编写和重写以下结构:

struct S{
    unsigned int A;
    unsigned int B;
};

在内存中,由 3 个结构组成的数组应具有以下布局:

A,B,A,B,A,B.

而不是:

*A,*B,*A,*B,*A,*B.

它也不应该是一个链表,因为我不需要知道一个条目何时结束,下一个条目何时开始。我所有的条目都是相同的大小,并且永远不会超过我在一个大块中分配的内容。还有大量条目,因此每个元素中尽可能少的开销很重要。不过,每个数组/向量/列表的一些开销是可以的。

我已经看到了使用 std::vector 的建议,但据我所知,每个元素都有一些开销,在这种情况下我不需要。

我应该在这里使用什么?如果动态数组是合适的,我可以:

S* arr = new S[x];

还能在调试器中显示为数组吗?

【问题讨论】:

  • std::vector 没有每个元素的开销。
  • 调试模式下存在“开销”,具体取决于您使用它的目的(以及您使用它的方式)。当然,您可以妥协并使用 std::array。
  • std::array 仅在大小固定时才有意义,因为它是类型的一部分(因此是静态的)。
  • @Robinson 虽然没有每个对象的内存开销。在未优化的构建中,边界和迭代器检查的开销“很好”,但无论如何这些构建都很慢。
  • Daniel,他说,“我所有的条目都是相同的大小,并且永远不会超过我在一个大块中分配的内容” - 所以理论上他可以使用 std::array如果他愿意,尽管他必须手动管理他的可用空间(同样取决于他实际使用它的方式)。

标签: c++ arrays memory struct stdvector


【解决方案1】:

std::vector 每个元素的开销为零,本质上是一个动态数组 à la new S[n],没有麻烦。这绝对是正确的工具。

请注意,为了在构造向量时获得最佳性能,您可以使用reserve()

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 2012-04-17
    • 2013-09-08
    • 2015-06-06
    • 2019-03-01
    • 2020-10-09
    • 2014-11-11
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多