【发布时间】: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