假设我们有一个struct
,例如:
struct MyStruct
{
enum Type { NONE, TYPE1, TYPE2 };
Type type;
int value;
}
现在,应用程序需要在数组或类似数据上存储未定义数量的这些结构。 问题是:在内存使用,速度,优雅等方面,哪种方式最好?
要有一个固定长度的数组,其长度应该知道不会被超越:
MyStruct myStructArray[200];
我认为这会导致更多的内存使用,因为它会为传入的struct实例保留空间。
要有一些可自行调换的数组机制,比如vector<MyStruct>
自行管理内存。
存储指向某个数组或struct
中每个vector
的指针。
答案 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更多或更少击。