मैं कई स्थानों पर विचार कर सकता हूं जहां सी सहायता में यूनियन उपयोगी हैं और वे स्मृति को बचाते हैं। चूंकि जंग एक सिस्टम प्रोग्रामिंग भाषा है, यह संघों का समर्थन क्यों नहीं करता है?जंग के संघ क्यों नहीं हैं?
उत्तर
यूनियनों को भाषा में जोड़ा गया था (RFC 1444), और वे Rust 1.19.0 के रूप में स्थिर हैं। उन्हें unsafe
ब्लॉक के उपयोग की आवश्यकता है।
कच्चे संघ स्मृति-सुरक्षित नहीं हैं (क्योंकि संकलक के लिए यह गारंटी नहीं है कि आप हमेशा संघ से सही प्रकार (यानी, सबसे हाल ही में लिखित प्रकार) पढ़ते हैं)। जंग के लक्ष्यों में से एक स्मृति सुरक्षा के साथ एक निम्न स्तर की भाषा बनाना है; चूंकि यूनियन उस लक्ष्य के साथ संगत नहीं हैं, इसलिए उन्हें जंग 1.0 में शामिल नहीं किया गया था।
इसके बजाए, जंग के पास enums है, जो छोटे स्मृति उपयोग के बदले यूनियनों के अधिकांश फायदे प्रदान करता है, लेकिन जो स्मृति स्मृति सुरक्षित है क्योंकि गणना मूल्य हमेशा उस विशेष प्रकार के ट्रैक को ट्रैक करता है।
जंग टैग किया है यूनियनों अपने बीजीय डेटा प्रकार के रूप में, 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।
संरेखण के कारण, आपके पास केवल दो प्रकार हैं (उदाहरण के लिए 'एनम एक्स {एस (i32), यू (u32)} 'आठ बाइट्स) टैग एक बाइट से बड़ा हो सकता है। तकनीकी रूप से यह तीन बाइट पैडिंग के साथ एक बाइट है, लेकिन अंतिम परिणाम वही है। – delnan
- 1. जंग
- 2. जंग
- 3. संघ या संघ के लिए, यह प्रश्न
- 4. मेरा संघ सही मूल्य क्यों नहीं दिखाता है?
- 5. संघ
- 6. जंग के
- 7. संघ
- 8. संघ
- 9. जंग
- 10. जंग
- 11. जंग
- 12. जंग
- 13. जंग
- 14. जंग
- 15. जंग
- 16. जंग
- 17. "जंग
- 18. जंग
- 19. जंग
- 20. जंग
- 21. जंग
- 22. जंग
- 23. जंग
- 24. जंग
- 25. जंग
- 26. जंग
- 27. जंग
- 28. संघ नहीं मिल सका, रेल 3
- 29. संघ-खोजने के
- 30. जंग के ऑपरेटरों के पास आउटपुट चर प्रकार क्यों है?
असल में यह [सी इस समय काम किया] [https://github.com/rust-lang/rust/pull/36016), बाहरी सी संगतता के लिए। – snuk182