h2o*_*2o2 1 memory-management rust
我有以下代码片段:
fn test() {
let addr = Box::new(1024);
println!("{:p}", addr);
}
fn main(){
test();
test();
}
Run Code Online (Sandbox Code Playgroud)
fn test() {
let addr = Box::new(1024);
println!("{:p}", addr);
}
fn main(){
test();
test();
}
Run Code Online (Sandbox Code Playgroud)
正如文档所解释的,Box::new将在堆上分配内存,然后将参数放入其中。无论我调用多少次test(),程序都会打印一个相同的地址。
为什么 Rust 分配相同的堆地址,即使代码在unsafe块中?这是正常行为吗?
由于您没有将结果存储在test函数之外,因此分配的内存会立即释放。这允许内存分配器在第二次调用时重用相同的地址。
我认为当前的
Box::new实现与我期望的行为不同
是的,这似乎很可能,但值得思考为什么您期望这种特定行为。对我来说,所展示的行为是有道理的。
或者至少我们应该在 [
Boxes] rustdoc上评论这个“优化”
Box无论如何,这不是 的优化。在没有所有者时立即释放值的行为是 Rust 语言定义的一部分。
它可以被认为是对当前使用的底层内存分配器的优化。然而,分配器的实现对许多程序员来说是有意义的,而且它并不是 Rust 独有的。例如,这里有一个类似的 C 程序:
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int i = 0; i < 10; i++) {
int32_t *v = malloc(sizeof(int32_t));
printf("%p\n", (void *)v);
free(v);
}
}
Run Code Online (Sandbox Code Playgroud)
% clang -std=c17 -Wpedantic -Wall alloc.c
% ./a.out
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
0x7f87c6401860
Run Code Online (Sandbox Code Playgroud)
请注意,内存分配器的实现是最终导致返回相同地址的原因;可以在不正确的地方编写内存分配器。