铁锈中的多个结构具有shrink_to
或shrink_to_fit
方法,如Vec
和String
。但显然没有什么能比得上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_range
、drain
、copy_within
、rotate
…(,然后截断,然后收缩。
像CCD_ 18和CCD_;存储器块";(也就是malloc/mmap返回的分配(,它们在随机指针方面不起作用。因此,假设的shrink_from_to
只是在幕后做这件事,因为你不能真正从两端调整分配的大小。