簡體   English   中英

為什么Rust中的“移動”實際上並沒有移動?

[英]Why does “move” in Rust not actually move?

在下面的例子中:

struct Foo {
    a: [u64; 100000],
}

fn foo(mut f: Foo) -> Foo {
    f.a[0] = 99999;
    f.a[1] = 99999;
    println!("{:?}", &mut f as *mut Foo);

    for i in 0..f.a[0] {
        f.a[i as usize] = 21444;
    }

    return f;
}
fn main(){
    let mut f = Foo {
        a:[0;100000]
    };

    println!("{:?}", &mut f as *mut Foo);
    f = foo(f);
    println!("{:?}", &mut f as *mut Foo);
}

我發現在傳入函數foo之前和之后, f的地址是不同的。 為什么Rust會在任何地方復制這么大的結構但實際上不會移動它(或實現這種優化)?

我理解堆棧內存是如何工作的。 但是根據Rust所有權提供的信息,我認為可以避免副本。 編譯器不必要地復制數組兩次。 這可以是Rust編譯器的優化嗎?

移動是一個memcpy,然后將源視為不存在。

你的大陣列在堆棧上。 這就是Rust的內存模型的工作方式:局部變量在堆棧中。 由於foo的堆棧空間在函數返回時消失,除了將內存復制到main的堆棧空間之外,編譯器無法做任何事情。

在某些情況下,編譯器可以重新排列事物,以便可以省略移動(源和目標合並為一件事),但這是一種不能依賴的優化,尤其是對於大事物。

如果你不想復制龐大的數組,可以自己在堆上分配它,或者通過Box<[u64]> ,或者只是使用Vec<u64>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM