如何在不重新分配的情况下从偏移中收缩Vec或String



铁锈中的多个结构具有shrink_toshrink_to_fit方法,如VecString。但显然没有什么能比得上shrink_from_to

我为什么要那样

假设我在内存中有一个XY千兆字节的字符串或向量,并且知道我感兴趣的部分的确切开始和结束位置(它只将Z GB从start分配到end,位于中间的某个位置(。我可以调用truncate,然后调用shrink_from_to,有效地释放内存
但是,[0..start]仍占用了千兆字节的内存,这与我的进一步处理无关。

问题

有没有办法在不重新分配和复制相关部分的情况下释放内存?

请注意,shrink_to_fit通过复制到较小的缓冲区并释放旧的缓冲区来进行重新分配。你最好的选择可能只是将你关心的切片转换为一个拥有的Vec,然后丢弃原始的Vec

fn main() {
let v1 = (0..1000).collect::<Vec<_>>(); // needs to be dropped
println!("{}", v1.capacity()); // 1000
let v2 = v1[100..150].to_owned(); // don't drop this!
println!("{}", v2.capacity()); // 50
drop(v1);
}

有没有办法在不重新分配和复制相关部分的情况下释放内存?

将要保留的段移动到集合的开头(例如replace_rangedraincopy_withinrotate…(,然后截断,然后收缩。

像CCD_ 18和CCD_;存储器块";(也就是malloc/mmap返回的分配(,它们在随机指针方面不起作用。因此,假设的shrink_from_to只是在幕后做这件事,因为你不能真正从两端调整分配的大小。

最新更新