如何延迟Rust的内存自动管理?

时间:2016-04-22 08:42:41

标签: memory-management rust

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有办法吗?

3 个答案:

答案 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实现运行可能很慢。)