Нет, Vec
(по состоянию на Rust 1.35) не предоставляет никакого механизма для управления стратегией перераспределения.
При вызове таких методов, как Vec::push
, текущая реализация Vec
удвоит емкость при заполнении вектора.Когда вы вызываете методы типа reserve_exact
, текущая реализация Vec
напрямую использует вашу емкость.
документы говорят, что Vec
будет (pointer, capacity, length)
триплет не больше и не меньше .
Это не исключает возможности очень осторожного расширения Vec
.Например, Vec
строится из RawVec
, который параметризуется распределителем .Пока вы используете распределитель нулевого размера (например, Global
), размер все равно будет истинным.
Это будет концептуально прямоиметь другой параметр типа для управления поведением изменения размера.Это, как говорится, вряд ли произойдет в ближайшее время.
Обходные пути
Если вам действительно нужно что-то подобное, вы можете создать новый тип вокруг 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);
}
}
Бесплатный совет
Не пытайтесь оптимизировать это, пока у вас нет эталонов, которые:
- Покажите, что это узкое место
- Может использоваться, чтобы доказать, что ваши "оптимизации" действительно ускоряют процесс
У меня может быть большое количество элементов в векторе и каждое перераспределение на некоторое небольшое количествоиз-за дополнительной мощности это приведет к значительным задержкам в процессах, которые я запускаю.
Я согласен с этим как с чувством интуиции, поэтому ваша идея так смущает меня:
Я хочу, чтобы он был перераспределен с 32 элементами больше
32 элемента - это небольшое количество дополнительной емкости;при этом создается впечатление, что вы снижаете производительность.