是否可以定义重新分配给std :: vec :: Vec的增量因子?

时间:2019-05-29 16:58:42

标签: rust

我的成长缓慢{@ {1}}。对于向量在超出其容量时的每次重新分配,我都希望通过静态数量的元素来重新分配。

例如,我最初分配一个包含1024个元素的向量。当它达到其容量时,我希望它可以再分配32个元素,并且希望此参数是可配置的。

我正在寻找这样的功能:

std::vec::Vec

位置:

Vec::new(initial_capacity, capacity_increment);

Rust(每晚或稳定)中是否提供此功能?

文档说,您只能指定初始容量,但尚不清楚每次重新分配时如何增加大小,或者是否可以更改此参数。实际上,文档显示initial_capacity = 1024; capacity_increment = 32; 将是Vec三元组,不多不少

有什么方法可以进行容量增加配置吗?

我需要此功能,因为向量中可能有很多元素,并且每次重新分配都需要少量的额外容量,这会导致我正在运行的进程出现相当大的延迟。

1 个答案:

答案 0 :(得分:3)

否,Vec(从Rust 1.35开始)没有提供任何控制重新分配策略的机制。

当调用诸如Vec::push之类的方法时,current implementation of Vec将在向量满时使容量增加一倍。当您调用诸如reserve_exact之类的方法时,current implementation of Vec将直接使用您的能力。

  

文档说Vec将是(pointer, capacity, length)三元组,不多也不少

这并不排除以非常谨慎的方式扩展Vec的可能性。例如,Vec是由parameterized by an allocatorRawVec构建的。只要您使用大小为零的分配器(例如Global),大小仍然为true。

从概念上讲直接使用另一个类型参数来控制调整大小行为是很简单的。话虽如此,似乎不太可能很快发生。

解决方法

如果您确实需要这样的内容,可以在Vec周围创建一个新类型,并在所有适当的位置调用reserve_exact

struct MyVec<T> {
    v: Vec<T>,
    increment: usize,
}

impl<T> MyVec<T> {
    fn new(capacity: usize, increment: usize) -> MyVec<T> {
        MyVec {
            v: Vec::with_capacity(capacity),
            increment,
        }
    }

    fn push(&mut self, val: T) {
        if self.v.len() == self.v.capacity() {
            self.v.reserve_exact(self.increment);
        }
        self.v.push(val);
    }
}

免费建议

在拥有基准测试之前,不要尝试对此进行优化:

  1. 表明这是一个瓶颈
  2. 可以用来证明您的“优化”实际上使事情变得更快
  

我的向量中可能有很多元素,每次重新分配都需要少量的额外容量,这会导致我正在运行的进程出现相当大的延迟。

我同意这是一种直觉,这就是为什么你的想法对我如此困惑:

  

我希望它可以再分配32个元素

32个元素 是少量的额外容量;通过这样做,好像您将要降低性能。