存储未定义长度的struct数组的最佳实践

时间:2013-08-02 09:14:17

标签: c++ arrays struct

问题

假设我们有一个struct,例如:

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

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

一些注意事项

  1. 要有一个固定长度的数组,其长度应该知道不会被超越:

    MyStruct myStructArray[200];
    

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

  2. 要有一些可自行调换的数组机制,比如vector<MyStruct>自行管理内存。

  3. 存储指向某个数组或struct中每个vector的指针。

3 个答案:

答案 0 :(得分:4)

std::vector<MyStruct>是更好的选择。还有另一个选项,它以某种方式非常接近向量,称为std::deque。看看它; 也许它会帮助你,或者至少提高你对标准容器的认识。 online doc说,

  

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

     

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

虽然std::deque不会将元素存储在连续的内存中,但它与RandomAccessIterator一起使用 - 非常类似于std::vector

答案 1 :(得分:2)

如果您的尺寸在运行时可能会有所不同,请使用std::vector<>,如果修复后使用std::array<>。尽管在std::deque<>中添加和删除元素的工作量低于std::vector<>,但vector<>会在连续内存中提供数据,尤其是对于线性遍历,更加缓存友好。与依赖于可以在内存中分发的btree或类似的容器相比,这将提高性能,从而导致遍历期间的缓存未命中。

答案 2 :(得分:0)

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

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

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

固定大小的方法是邪恶的,因为极少数情况下你可以证明你的限制不会被超过,所以在大多数情况下它不会比等待的bug更多或更少击。