2016-01-14 26 views
8

एक साधारण उदाहरण:जंग नियंत्रक कैसे जानता है कि कोई मान स्थानांतरित हो गया है या नहीं?

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) मामले में समझते हैं, aus(a) पर ले जाया जाता है, तो यह उत्पादन है "टेस्ट इस्तेमाल होता है ड्रॉप अंत "।

हालांकि, test(1) में, आउटपुट "टेस्ट-एंड-ड्रॉप" है, जिसका अर्थ है कि संकलक जानता है कि a स्थानांतरित नहीं किया गया था।

हैं us(a) कहा जाता है, यह ड्रॉप करने test(i) में a, यह us(a) में गिरा दिया जाएगा अनावश्यक हो जाएगा; और यदि us(a) नहीं कहा जाता है, aprintln!("end") के बाद गिरा दिया जाना चाहिए।

चूंकि यह असंभव है संकलक पता करने के लिए के लिए us(a) कहा जाता है या नहीं,, कैसे संकलक पता है कि क्या a.drop()println!("end") के बाद या कहा जाता है किया जाएगा नहीं?

उत्तर

9

यह Rustnomicon में समझाया गया है:

जंग 1.0 के रूप में, ड्रॉप झंडे वास्तव में नहीं-तो-चुपके से किसी भी प्रकार कि ड्रॉप लागू करता है की एक छिपी हुई फ़ील्ड में रखे हैं।

छुपा क्षेत्र बताता है कि वर्तमान मूल्य गिरा दिया गया है या नहीं, और यदि ऐसा नहीं है तो यह है। इस प्रकार, यह रन-टाइम पर जाना जाता है, और कुछ पुस्तक रखने की आवश्यकता होती है।


भविष्य के लिए देख रहे हैं, वहाँ remove these hidden fields करने के लिए एक आरएफसी है।

आरएफसी के विचार से छिपा क्षेत्रों को बदलने के लिए है:

  1. बिना शर्त बूंदों की पहचान करना ढेर पर
  2. छिपाने की जगह एक छिपी हुई फ़ील्ड (उन किसी भी चलाने के समय की जांच की जरूरत नहीं है) , समारोह फ्रेम में, उन मूल्यों के लिए सशर्त हटा दिए

इस नई रणनीति वर्ष से अधिक के कई फायदे हैं:

  • मुख्य लाभ यह जा रहा है कि #[repr(C)] अब हमेशा सी एक के लिए एक प्रतिनिधित्व बराबर दे देंगे, भले ही struct लागू करता Drop
  • एक और महत्वपूर्ण लाभ स्मृति की बचत है
  • एक और मामूली लाभ (नहीं struct आकार बढ़ा-चढ़ाकर द्वारा) बिना शर्त बूंदों और बेहतर कैशिंग (मेमोरी आकार को कम करने से) के कारण संभव मामूली गति लाभ है
संबंधित मुद्दे

 संबंधित मुद्दे