簡體   English   中英

為什么 Rust 中的默認行為是在賦值時執行移動,而不是僅僅創建對值的另一個“引用”?

[英]Why is the default behavior in Rust to perform a move on assignment rather than just create another "reference" to the value?

在 Rust 中,如果您執行以下操作:

let v1 = String::from("hello");
let v2 = v1;
println!("{}", v1);

您將收到編譯器錯誤,因為 Rust 中的=執行移動,而不是復制或“共享”。

我正在閱讀這篇文章,其中更詳細地討論了這一點:

但是還有一個更大的問題,關於解除分配。 如果使用共享語義, v1v2都將擁有單個數據緩沖區,因此當它們被釋放時,相同的堆緩沖區將被釋放兩次。 一個緩沖區不能被分配兩次,否則會導致內存損壞和程序故障。 為了解決這個問題,使用共享語義的語言不會在使用這種內存的變量范圍的末尾釋放內存,而是求助於垃圾收集。

我的問題是,當v1v2超出范圍時,為什么需要釋放數據緩沖區兩次? 除了“銷毀” v1v2之外,我們不能只釋放一次數據緩沖區嗎? 我知道v1v2實際上是值而不是引用,但是不使它們具有上述行為的“智能引用”的理由是什么?

[...] 不讓它們成為“智能參考”的理由是什么?

性能,主要是。 Rust 是關於“零成本抽象”(由 C++ 創造的術語)。 如果程序員不需要,該語言不應產生運行時開銷。 這種“智能引用”將是引用計數指針(如 Rust 中的RcArc ,或 C++ 中的shared_ptr需要垃圾收集器。 這兩種解決方案都有這種開銷。

暫無
暫無

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

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