2015-03-25 7 views
18

मैं कई स्थानों पर विचार कर सकता हूं जहां सी सहायता में यूनियन उपयोगी हैं और वे स्मृति को बचाते हैं। चूंकि जंग एक सिस्टम प्रोग्रामिंग भाषा है, यह संघों का समर्थन क्यों नहीं करता है?जंग के संघ क्यों नहीं हैं?

उत्तर

29

यूनियनों को भाषा में जोड़ा गया था (RFC 1444), और वे Rust 1.19.0 के रूप में स्थिर हैं। उन्हें unsafe ब्लॉक के उपयोग की आवश्यकता है।

कच्चे संघ स्मृति-सुरक्षित नहीं हैं (क्योंकि संकलक के लिए यह गारंटी नहीं है कि आप हमेशा संघ से सही प्रकार (यानी, सबसे हाल ही में लिखित प्रकार) पढ़ते हैं)। जंग के लक्ष्यों में से एक स्मृति सुरक्षा के साथ एक निम्न स्तर की भाषा बनाना है; चूंकि यूनियन उस लक्ष्य के साथ संगत नहीं हैं, इसलिए उन्हें जंग 1.0 में शामिल नहीं किया गया था।

इसके बजाए, जंग के पास enums है, जो छोटे स्मृति उपयोग के बदले यूनियनों के अधिकांश फायदे प्रदान करता है, लेकिन जो स्मृति स्मृति सुरक्षित है क्योंकि गणना मूल्य हमेशा उस विशेष प्रकार के ट्रैक को ट्रैक करता है।

+1

असल में यह [सी इस समय काम किया] [https://github.com/rust-lang/rust/pull/36016), बाहरी सी संगतता के लिए। – snuk182

21

जंग टैग किया है यूनियनों अपने बीजीय डेटा प्रकार के रूप में, enum:

enum Foo { 
    Bar(i32), 
    Baz, 
    Quux { 
     misc: A, 
     ellaneous: B, 
     fields: C, 
    }, 
} 

एक Foo हो सकता है या तो एक संलग्न i32 के साथ एक Bar, कोई अतिरिक्त डेटा या एक Quux के साथ एक Baz उन तीन विविध क्षेत्रों के साथ। यह एक टैग किया गया यूनियन है- एक enum का आकार टैग के लिए जितना आवश्यक है उतना ही अधिक नहीं होगा (आमतौर पर एक बाइट, लेकिन मुझे लगता है कि एक बाइट में फिट होने के मुकाबले ज्यादा भिन्नताएं हो सकती हैं), और कुछ मामलों में जहां इसे अनुकूलित किया जा सकता है (जैसे Option<&T> जहां Some संस्करण के लिए 0 का मेमोरी पता कानूनी नहीं है और इसलिए None संस्करण का प्रतिनिधित्व करने के लिए उपयोग किया जा सकता है) संस्करण को मूल्य में निचोड़ा जाता है।


क्या जंग नहीं करता है सी क्यों के रूप टैग नहीं किए गए यूनियनों है? क्योंकि वे मौलिक रूप से असुरक्षित हैं, और सुरक्षा जंग के लिए सर्वोपरि है। यदि आप अभी भी ऐसा कुछ चाहते हैं, तो असुरक्षित कोड के चारों ओर एक रैपर बनाने के लिए पूरी तरह से संभव है कि आप ट्रांसमिशनेशन जैसी चीजों के साथ हवादार हो जाएंगे, लेकिन आपको सामान्य जीवन में अनगिनत यूनियनों की आवश्यकता नहीं है।

जंग अब असुरक्षित यूनियनों को एक असुरक्षित अवधारणा के रूप में समर्थन देता है; as of 1.19.0

+3

संरेखण के कारण, आपके पास केवल दो प्रकार हैं (उदाहरण के लिए 'एनम एक्स {एस (i32), यू (u32)} 'आठ बाइट्स) टैग एक बाइट से बड़ा हो सकता है। तकनीकी रूप से यह तीन बाइट पैडिंग के साथ एक बाइट है, लेकिन अंतिम परिणाम वही है। – delnan