Memory management 填充任意大小的向量而不调整数组大小的惯用方法?

Memory management 填充任意大小的向量而不调整数组大小的惯用方法?,memory-management,rust,memory-pool,Memory Management,Rust,Memory Pool,有时,您希望分配数据而不提前知道需要多少数据 大多数情况下,向量都很好,但有时分配一系列内存块、根据需要创建新的块会更有效 如果您不需要通过索引直接访问它们(例如,仅弹出最后一项),那么它们可以作为内存块保存。否则,一旦完成,就可以分配一个固定大小的向量,并将数据复制到其中 P> >在C++中,用 > LIKEDLIST/ >代码> VEC,有一种更习惯的方式来执行这个任务吗? < P>实际上,在这种情况下,我倾向于 VEC>代码>,类似于 STD::DeQu/Cuth>是如何在C++中覆盖的

有时,您希望分配数据而不提前知道需要多少数据

大多数情况下,向量都很好,但有时分配一系列内存块、根据需要创建新的块会更有效

如果您不需要通过索引直接访问它们(例如,仅弹出最后一项),那么它们可以作为内存块保存。否则,一旦完成,就可以分配一个固定大小的向量,并将数据复制到其中


<> P> >在C++中,用<代码> > LIKEDLIST/<代码> >代码> VEC,有一种更习惯的方式来执行这个任务吗?

< P>实际上,在这种情况下,我倾向于<代码> VEC>代码>,类似于 STD::DeQu/Cuth>是如何在C++中覆盖的。 如果
Vec
的所有内部
Vec
具有相同的最大大小,并且除第一个和最后一个
Vec
外,其他所有的
Vec
都已满到边缘,则可以实现O(1)索引和内存稳定性


当然,指向块的指针会随着外部
Vec
的重新分配和所有操作而移动,但是24字节的
memcpy
就足够容易了。

a
(Vec,Vec)
可能比
Vec
更好,因为对于所有内部分配来说,没有什么意义,最后一个
Vec
内联将有助于更快的推送/弹出。但这最多只是一件小事。@Veedrac:Vec和Box之间的最大区别在于后者需要精确的元素数量,而你可以根据需要增加Vec,直到它获得其“最大”元素数量(但首先保留,以避免重新分配)。这就是为什么它是
(Vec,Vec)
,不仅仅是
Vec
。你不想调整中间值,因为这些都是满的。事实上,放松流行/推送可能值得将第一个元素和最后一个元素分开。但是请注意,在
deque
(C++)中,您可以从两端弹出/推送,并且这样做的成本最低,每次从前面完全弹出一个块时,不需要移动所有块。在我的例子中,这意味着在
Vec
中保留空的
Vec
,这很好,因为您可以有一个索引来指示第一个和最后一个非空的索引。
Vec
对于deque来说是不够的,因为您也需要在LHS上向后插入。我不太清楚C++是如何做到这一点的,但是<代码> VecDeque <代码>会起作用,尽管稍微有点低效。