0

问题

假设我们有一个struct这样的:

struct MyStruct
{
  enum Type { NONE, TYPE1, TYPE2 };
  Type type;
  int value;
}

现在,应用程序需要将未定义数量的这些结构存储在数组或类似物中。问题是:在内存使用、速度、优雅等方面,哪种方法是最好的?

一些注意事项

  1. 要拥有一个长度已知不会被超越的固定长度数组:

    MyStruct myStructArray[200];
    

    我想这会导致更多的内存使用,因为它会为传入的结构实例保留空间。

  2. 拥有一些可自动调整大小的数组机制,例如自己vector<MyStruct>管理内存。

  3. 将指向每个struct数组的指针存储或vector.

4

3 回答 3

4

std::vector<MyStruct>是更好的选择。还有另一种选择,它在某种程度上非常接近向量,称为 std::deque. 看看它; 也许它会帮助你,或者至少增加你对标准容器的认识。在线文档说,

与 相反std::vector,双端队列的元素不是连续存储的:典型的实现使用一系列单独分配的固定大小的数组。

双端队列的存储会根据需要自动扩展和收缩。deque 的扩展比 a 的扩展更便宜,std::vector因为它不涉及将现有元素复制到新的内存位置。

虽然,std::deque不会将元素存储在连续的内存中,但它可以与RandomAccessIterator- 非常像std::vector.

于 2013-08-02T09:20:07.840 回答
2

如果std::vector<>您的大小在运行时会发生变化,请使用,std::array<>如果它是固定的,请使用。尽管在 a 中添加和删除元素的工作量std::deque<>低于 a std::vector<>vector<>但在连续内存中提供数据,尤其是。对于线性遍历,缓存更友好。与依赖 btree 或类似的容器相比,这将提高性能,这些容器可以分布在内存中,导致遍历期间缓存未命中。

于 2013-08-02T09:31:06.840 回答
0

您忘记了一种可能性:动态分配的数组。你也可以这样做:

long myStructCount = /*whatever*/;
MyStruct* myStructArray = new MyStruct[myStructCount];

std::vector<MyStruct>从使用的角度来看,这更糟糕,但绝对比那种邪恶MyStruct myStructArray[200]的方法更可取。

固定大小的方法是邪恶的,因为在极少数情况下你可以证明你的限制不会被超过,所以在大多数情况下,它只不过是一个等待攻击的错误。

于 2013-08-02T09:34:55.820 回答