Rust 使用基于区域的内存管理吗?
Is Rust using region-based memory management?
例如,如果我们忘记 return 值优化,并有以下代码:
fn func() -> Box<String> {
Box::new(String::new())
}
fn main() {
let boxed_string = func();
}
编译器会创建区域来管理内存还是会使用正常的堆分配?
我知道这个简单的代码可能会被优化,但在更复杂的代码中,情况可能并非如此。
虽然生命周期可以在与基于区域的内存管理相同的意义上被称为 "regions",但 Rust 不会 基于它们自动管理内存。生命周期仅用于静态分析。内存以正常方式分配——寄存器、堆栈、堆(一些 C 风格的 malloc
函数),如果像在 typed-arena
crate 中手动实现的那样,可能还有其他抽象,如内存池。然后编译器使用区域的概念分析这种非常普通的内存管理,但这根本不会影响 运行 时间行为。事实上,甚至在生成机器代码之前,生命周期就从程序中删除了。
但是,您的代码中可能还有其他 移动 。 Box::new
是一个将参数移动到其中的普通函数,同样 String::new
的 return 可能涉及移动。
例如,如果我们忘记 return 值优化,并有以下代码:
fn func() -> Box<String> {
Box::new(String::new())
}
fn main() {
let boxed_string = func();
}
编译器会创建区域来管理内存还是会使用正常的堆分配?
我知道这个简单的代码可能会被优化,但在更复杂的代码中,情况可能并非如此。
虽然生命周期可以在与基于区域的内存管理相同的意义上被称为 "regions",但 Rust 不会 基于它们自动管理内存。生命周期仅用于静态分析。内存以正常方式分配——寄存器、堆栈、堆(一些 C 风格的 malloc
函数),如果像在 typed-arena
crate 中手动实现的那样,可能还有其他抽象,如内存池。然后编译器使用区域的概念分析这种非常普通的内存管理,但这根本不会影响 运行 时间行为。事实上,甚至在生成机器代码之前,生命周期就从程序中删除了。
但是,您的代码中可能还有其他 移动 。 Box::new
是一个将参数移动到其中的普通函数,同样 String::new
的 return 可能涉及移动。