एक साधारण उदाहरण:जंग नियंत्रक कैसे जानता है कि कोई मान स्थानांतरित हो गया है या नहीं?
struct A;
fn main() {
test(2);
test(1);
}
fn test(i: i32) {
println!("test");
let a = A;
if i == 2 {
us(a);
}
println!("end");
}
impl Drop for A {
fn drop(&mut self) {
println!("drop");
}
}
#[allow(unused_variables)]
fn us(a: A){
println!("use");
}
जब मैंने इसे चलाने के लिए, उत्पादन होता है:
test
use
drop
end
test
end
drop
मैं test(2)
मामले में समझते हैं, a
us(a)
पर ले जाया जाता है, तो यह उत्पादन है "टेस्ट इस्तेमाल होता है ड्रॉप अंत "।
हालांकि, test(1)
में, आउटपुट "टेस्ट-एंड-ड्रॉप" है, जिसका अर्थ है कि संकलक जानता है कि a
स्थानांतरित नहीं किया गया था।
हैं us(a)
कहा जाता है, यह ड्रॉप करने test(i)
में a
, यह us(a)
में गिरा दिया जाएगा अनावश्यक हो जाएगा; और यदि us(a)
नहीं कहा जाता है, a
println!("end")
के बाद गिरा दिया जाना चाहिए।
चूंकि यह असंभव है संकलक पता करने के लिए के लिए us(a)
कहा जाता है या नहीं,, कैसे संकलक पता है कि क्या a.drop()
println!("end")
के बाद या कहा जाता है किया जाएगा नहीं?