2013-07-27 9 views
14

मुझे आश्चर्य है कि बूस्ट वेरिएंट और union डेटा-प्रकार सी/सी ++ में अंतर क्या है। मुझे पता है कि union डेटा-प्रकार एक ही स्मृति स्थान लेता है और स्मृति के क्षेत्र में सबसे बड़ा डेटा प्रकार स्मृति की कुल मात्रा का उपयोग करता है उदा।सीओ/सी ++ में अनिवार्य रूप से एक संघ को बढ़ावा दें?

union space { 
    char CHAR; 
    float FLOAT; 
    int INTEGER; 
}S; 

int के बाद से स्मृति के 4 बाइट ले लेना चाहिए और float सबसे बड़ा और समान आकार के होते हैं। बूस्ट वेरिएंट और union डेटा प्रकारों के बीच अन्य तरीकों में समानताएं और मतभेद हैं? मुझे यह भी पता है कि बूस्ट संस्करण कोई डेटा प्रकार ले सकता है और यह डेटा प्रकार "बहुरूपता" की अनुमति देता है (अगर मैं ओओपी विषय शब्द का दुरुपयोग कर रहा हूं तो मुझे सही करें)। क्या संघीय डेटा प्रकार इसलिए एक प्रकार का बहुरूपता है?

उत्तर

11

बूस्ट संस्करण एक संघ का अनुकरण करता है लेकिन यह इसके कार्यान्वयन में एक संघ का उपयोग नहीं करता है। इसके बजाए यह गठबंधन भंडारण और प्लेसमेंट का उपयोग करता है।

यह इस अर्थ में बहुलक है कि यदि आप किसी भिन्नता पर विज़िटर ऑब्जेक्ट लागू करते हैं तो यह आपके लिए सही अधिभार चुन देगा। यह चयन रनटाइम पर होना चाहिए, लेकिन इसके लिए ऑब्जेक्ट कोड संकलित समय पर अनलॉक किया गया है। तो यह काफी तेज़ है।

16

प्राथमिक अंतर यह है कि बूस्ट का संस्करण जानता है कि इसमें किस प्रकार का संग्रह किया जाता है, इसलिए आप गलतियां नहीं कर सकते हैं या यूबी को एक वैरिएंट का दुरुपयोग करने से प्राप्त नहीं कर सकते हैं। यह वेरिएंट को गैर-पीओडी (यानी वास्तव में उपयोगी) प्रकार लेने की अनुमति देता है। वेरिएंट में कुछ अतिरिक्त चाल भी हैं जैसे आगंतुकों और रिकर्सिव वेरिएंट को अनुमति देना।

यूनियनों का उपयोग करने के लिए सबसे अच्छी मार्गदर्शिका "नहीं है, क्योंकि यूबी के बिना उन्हें अच्छे उपयोग में रखना लगभग असंभव है"। यह Variant पर लागू नहीं होता है, इसलिए यह अनुशंसा करने के लिए बहुत सुरक्षित है।

+3

"यूबी" और "पीओडी" क्या है? – pandoragami

+3

@ user2555139 अपरिभाषित व्यवहार और सादा पुराना डेटा (प्रकार) – Rapptz

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