【问题标题】:Best practice for storing an array of struct of undefined length存储未定义长度的结构数组的最佳实践
【发布时间】:2013-08-03 11:57:30
【问题描述】:

问题

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

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

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

一些注意事项

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

    MyStruct myStructArray[200];
    

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

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

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

【问题讨论】:

  • 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
  • 我个人使用 3,从来没有遇到过任何问题。但是您的结构似乎很小,我认为您不必担心空间。
  • 只能同意 jrok,我会使用 std::vector。其他解决方案更容易出错(溢出/内存管理)。
  • 这完全取决于你要用它做什么。有关将为您进行内存管理的不同类型容器的概述:en.cppreference.com/w/cpp/container
  • @JosephPla 好吧,假设这是一个示例通用结构。我正在寻找任何大小结构的通用答案。

标签: c++ arrays struct


【解决方案1】:

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

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

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

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

【讨论】:

  • 据我了解,这种可能性只是 array 方法的第三种可能性。另外,它并不能防止应用程序在超过myStructCount时崩溃,所以它和1没有太大区别。
  • @j4nSolo 不,它与 3. 不同,因为它使用 MyStruct 的数组而不是 MyStruct* 的数组。此外,即使在技术上可以超过 myStructCount,但如果 myStructCount 计算正确,则不可能。关键是,您不使用任意的固定限制,而是需要的实际空间量。第一个几乎总是一个错误,第二个可以相对容易地以无错误的方式处理。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    虽然std::deque 不会将元素存储在连续内存中,但它可以与RandomAccessIterator 一起使用——很像std::vector

    【讨论】:

    • 如果 op 想要在随机位置进行大量添加、插入、删除怎么办?
    • @hetepeperfan:可能有很多假设。如果他不想这样呢?
    • 那么他应该更好地说明他/她的问题。
    • @hetepeperfan:顺便说一句,std::dequeRandomAccessIterator 一起使用。
    • 假设添加的内容不多,删除的内容很少或没有。我认为@Nawaz 的回答足以解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多