Rust开发了一个聪明的内存管理系统,但我有以下情况:
loop {
let mut example = Very_Complicated_Struct::new();
// very complicated data structure created
dealing_with(&mut example);
}
// End of scope, so Rust is supposed to automatically drop the
// memory of example here, which is time consuming
time_demanding_steps();
// But I want Rust to drop memory here,
// after the time_demanding_steps()
Rust有办法吗?
答案 0 :(得分:6)
使用TypedArena
也可能是一种解决方案。
let arena = Arena::new()
loop {
let example = arena.alloc(Very_Complicated_Struct::new());
dealing_with(example);
}
time_demanding_steps();
// Arena and all contained values are dropped
您必须遵守一些限制,特别是您不会直接拥有该结构;你只得到&mut T
。
这是“垃圾持有人”模式described by Matthieu M.的专门案例。
答案 1 :(得分:3)
有两种可能的解决方法:
在高性能系统中,通过简单地重复使用相同的对象(及其所有已分配的内存),回收可以帮助避免所有丢弃/创建迭代;但是,如果不仔细,可能意味着从一次使用到另一次使用的信息泄露。
延迟要简单得多,尽管不是那么快。在您的情况下,它将涉及使用Vec
来延迟销毁:
let mut delayed_destruction = vec!();
loop {
let mut example = Very_Complicated_Struct::new();
// very complicated data structure created
dealing_with(&mut example);
// Will be destroyed later.
delayed_destruction.push(example);
}
time_demanding_steps();
// Destruction occurs here
答案 2 :(得分:2)
您可以在循环外创建一次结构,并在每次迭代时清除它。
Rust在堆栈上分配这样的变量,所以它不能无限地添加它们,否则你会得到堆栈溢出。 (另外,摆脱内存的速度非常快;如果它有很多内部的东西,比如Vecs和Strings要解除分配,那么Drop实现运行可能很慢。)