相关疑难解决方法(0)

为什么 Rust 编译器在移动对象后不重用堆栈上的内存?

我认为一旦一个对象被移动,它在堆栈上占用的内存可以被重用于其他目的。但是,下面的最小示例显示了相反的情况。

#[inline(never)]
fn consume_string(s: String) {
    drop(s);
}

fn main() {
    println!(
        "String occupies {} bytes on the stack.",
        std::mem::size_of::<String>()
    );

    let s = String::from("hello");
    println!("s at {:p}", &s);
    consume_string(s);

    let r = String::from("world");
    println!("r at {:p}", &r);
    consume_string(r);
}
Run Code Online (Sandbox Code Playgroud)

使用--release标志编译代码后,它在我的计算机上提供以下输出。

String occupies 24 bytes on the stack.
s at 0x7ffee3b011b0
r at 0x7ffee3b011c8
Run Code Online (Sandbox Code Playgroud)

很明显,即使s被移动,r也不会重用最初属于 的堆栈上的 24 字节块s。我认为重用移动对象的堆栈内存是安全的,但为什么 Rust 编译器不这样做呢?我错过了任何角落案例吗?

更新:如果我s用大括号括起来,r可以重用堆栈上的 24 字节块。

String occupies 24 bytes on …
Run Code Online (Sandbox Code Playgroud)

llvm compiler-optimization rust

14
推荐指数
1
解决办法
408
查看次数

标签 统计

compiler-optimization ×1

llvm ×1

rust ×1