2013-05-12 14 views
51

जंग में, संदर्भ कभी नहीं अशक्त हो सकता है, इसलिए इस मामले में जहां आप वास्तव में इस तरह के एक लिंक्ड सूची के रूप में, अशक्त की जरूरत है, तो आप Option प्रकार का उपयोग करें:जंग के विकल्प प्रकार का ऊपरी भाग क्या है?

struct Element { 
    value: i32, 
    next: Option<Box<Element>>, 
} 

कितना भूमि के ऊपर स्मृति के मामले में इस में शामिल है आवंटन और एक साधारण सूचक की तुलना में dereference के लिए कदम? क्या Option लागत मुक्त, या Option को निर्माण का उपयोग करके, या वेक्टर में पॉइंटर को लपेटकर किसी भी गैर-कोर लाइब्रेरी में स्वयं को संकलित करने के लिए कंपाइलर/रनटाइम में कुछ "जादू" है ?

उत्तर

55

हां, कुछ कंपाइलर जादू है जो Option<ptr> को एक पॉइंटर (अधिकांश समय) में अनुकूलित करता है।

use std::mem::size_of; 

macro_rules! show_size { 
    (header) => (
     println!("{:<22} {:>4} {}", "Type", "T", "Option<T>"); 
    ); 
    ($t:ty) => (
     println!("{:<22} {:4} {:4}", stringify!($t), size_of::<$t>(), size_of::<Option<$t>>()) 
    ) 
} 

fn main() { 
    show_size!(header); 
    show_size!(i32); 
    show_size!(&i32); 
    show_size!(Box<i32>); 
    show_size!(&[i32]); 
    show_size!(Vec<i32>); 
    show_size!(Result<(), Box<i32>>); 
} 

निम्न आकारों (64-बिट मशीन पर है, तो संकेत 8 बाइट्स कर रहे हैं) मुद्रित कर रहे हैं:

// As of Rust 1.22.1 
Type      T Option<T> 
i32      4 8 
&i32      8 8 
Box<i32>     8 8 
&[i32]     16 16 
Vec<i32>     24 24 
Result<(), Box<i32>>  8 16 

ध्यान दें कि &i32, Box, &[i32], Vec<i32> सभी गैर-व्यर्थ सूचक का उपयोग Option के अंदर अनुकूलन!

+17

इसके अलावा, यह अनुकूलन सभी "' विकल्प 'जैसी "enums" में होता है, इसलिए यह उपयोगकर्ता द्वारा परिभाषित' विकल्प' के लिए भी काम करेगा। –

6

यह उत्तर अब अप्रचलित है; Option<T> में भेदभाव अब जहां संभव हो अनुकूलित किया गया है।एक Option प्रकार किसी अन्य enum प्रकार की तुलना में अंतरिक्ष के एक ही राशि पर है (उपलब्ध कराई गई जानकारी के बाकी अभी भी दिलचस्प है, हालांकि है।)

अभी के लिए,। मैं विशिष्टताओं को नहीं जानता, लेकिन यह निश्चित रूप से कुछ प्रकार के भेदभाव संघ के रूप में प्रतिनिधित्व किया जाता है।

ऑप्टिमाइज़ेशन के लिए आंतरिक प्रतिनिधित्व को ट्विक करने की संभावना जंग डेवलपर्स द्वारा विचार की जा रही है।

यहाँ एक relevant discussion on the dev mailing list, पैट्रिक वाल्टन द्वारा पोस्ट की गई है:

मैं, थोड़ा enums की एक विशेष बिट प्रतिनिधित्व करने के लिए प्रतिबद्ध करने के लिए संकोच कर रहा हूँ के बाद से वहाँ संकलक अनुकूलन यहाँ के लिए कमरे के बहुत सारे। उदाहरण के लिए, हम एक नल सूचक में Option<~int> संक्षिप्त करने के लिए चाहते हो सकता है, हम एक नल स्ट्रिंग में Result<(),~str> संक्षिप्त करने के लिए चाहते हो सकता है, या हम 1 शब्द में Either<u8,~str> संक्षिप्त करने के लिए, यह सोचते हैं कि तार शीर्ष 256 बाइट्स पर कब्जा नहीं कर सकते हैं चाहते हो सकता है पता स्थान का। मैंने थोड़ी देर के लिए सोचा है कि शायद यह के लिए सबसे अच्छा है बस कहें कि हमें अनुकूलन के साथ खेलने के लिए जितना संभव हो उतना कमरा देने के लिए जंग जंगलों का थोड़ा पैटर्न अनिर्दिष्ट है।

+1

यह गलत है। (इनमें से कुछ) आपके द्वारा उल्लेख किए गए ऑप्टिमाइज़ेशन [लागू] किए गए हैं (https://github.com/mozilla/rust/pull/6001)। – huon

+1

ठीक है, जैसा कि आपने कहा है कि यह जंग के वर्तमान संस्करण के लिए सही है :-) – barjak

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