2011-08-26 16 views
10

हाल ही में मैं विंडोज़ पर काम कर रहा हूं और मैंने पाया कि बहुत से डेटा संरचनाओं को के रूप में union के साथ सदस्य चर के रूप में परिभाषित किया गया है। इसका उदाहरण विंडोज में EVT_VARIANT होगा।संघ क्या है?

मुझे यह समझने में असफल रहा कि इसके पीछे क्या उद्देश्य है।

+0

ठीक है, वास्तव में आपके प्रश्न का क्या कारण था? यूनियनों का उद्देश्य समय-साझा करना है एक मेमोरी एरिया, यानी एक ही मेमोरी क्षेत्र में अलग-अलग प्रकार के डेटा को स्टोर करने के लिए। यह कहीं भी काम कर सकता है, यानी एक यूनियन का इस्तेमाल स्वयं ही किया जा सकता है या इसे एक स्ट्रक्चर के सदस्य के रूप में इस्तेमाल किया जा सकता है। बिल्कुल कुछ खास नहीं है या संघ में अजीब एक संरचना के अंदर इस्तेमाल किया जा रहा है। इस कारण से, यह स्पष्ट नहीं है कि आप यह क्यों पूछ रहे हैं। – AnT

उत्तर

16

जब struct में union सदस्य होते हैं तो यह आमतौर पर अंतरिक्ष बचत तंत्र के रूप में किया जाता है। यदि struct कुछ उप-प्रकारों का हो सकता है जिसके द्वारा केवल कुछ सदस्य मान्य हैं तो union स्थान बर्बाद न करने का एक अच्छा तरीका है। चल बिन्दु और पूर्णांक:

उदाहरण

enum NumberKind { 
    Integer, 
    FloatingPoint 
}; 

struct Number { 
    NumberKind kind; 
    union { 
    int integerValue; 
    float floatValue; 
    }; 
}; 

इस परिदृश्य में मैं एक struct संख्या संख्यात्मक मान के प्रकार के प्रकार हो सकता है परिभाषित किया है के लिए

। दोनों सदस्यों को हमेशा परिभाषित करके अंतरिक्ष को बर्बाद करने के बजाय एक ही समय में वैध नहीं है, मैंने union बनाया है जो दोनों के आकार के बराबर दोनों का भंडारण बनाता है।

से ऊपर की

नमूना प्रयोग अनुरोध किया

void PrintNumber(Number value) { 
    if (value.kind == Integer) { 
    printf("%d\n", value.integerValue); 
    } else { 
    printf("%f\n", value.floatValue); 
    } 
} 
+1

@downvoter, व्याख्या करने के लिए धन्यवाद? – JaredPar

+0

स्पष्टीकरण के लिए धन्यवाद, लेकिन क्या आप इसके उपयोग पर अधिक विस्तृत जानकारी दे सकते हैं। – Avinash

+1

@Avinash ने नमूना उपयोग केस – JaredPar

1

एक स्ट्रक्चर तकनीक में संघ आमतौर पर उपयोग किया जाता है जब आप एक संस्करण-शैली संरचना चाहते हैं। यह आमतौर पर एक प्रकार पहचानकर्ता के साथ होता है, जिसका उपयोग यह निर्धारित करने के लिए किया जाता है कि संघ में कौन सी वस्तु जांचनी है। यह विपरीत तरीके से भी देखा जाता है, जैसे Xlib पर * NIX, जहां यह structs के साथ एक संघ है, सभी सूत्रों के बीच पहले सदस्य के समान, परिभाषित करने के लिए कि कौन सी संरचना में आपको आवश्यक डेटा है।

0

संघ मतलब है कि आप इसके संभावित मूल्य के रूप में अपने सदस्यों में से एक हो सकता है। निम्नलिखित उदाहरण में, आप उनमें से प्रत्येक के लिए मान देखते हैं। लेकिन यह संघ किसी अन्य संरचना का सदस्य हो सकता है, जहां यह केवल एक मान निर्दिष्ट करने के लिए पर्याप्त है- या तो फ्लोट या पूर्णांक दोनों नहीं। उम्मीद है कि यह मदद करता है।

union { 
      float u_f; 
      int u_i; 
    }var; 

    var.u_f = 23.5; 
    printf("value is %f\n", var.u_f); 
    var.u_i = 5; 
    printf("value is %d\n", var.u_i) 
3

कल्पना कीजिए कि आपके पास एक संरचना है जिसमें डेटा का एक पैकेट है। पैकेट में डेटा कुछ अलग-अलग प्रकारों का हो सकता है, इसलिए आप प्रकार को नामक सदस्य में टाइप करते हैं। तो इस पैकेट में डेटा को पढ़ने के लिए, आप पहले प्रकार की जांच करें, फिर आप संबंधित डेटा सदस्य को पढ़ते हैं, जिसमें पैकेट में डेटा होना चाहिए।

यूनियनों के बिना डेटा struct इस प्रकार दिखाई देगा:

struct data { 
    type_t type; 

    int number; 
    char * string; 
    double fraction; 
    long long big_number; 
} 

यह एक नहीं बल्कि बड़े डेटा संरचना होगा। यह हर संभव डेटा प्रकार में से एक को स्टोर करने के लिए पर्याप्त कमरे का उपयोग करता है। यह थोड़ा अनावश्यक है जब आप निश्चित रूप से केवल उन सदस्यों में से एक होंगे जिनके पास किसी भी समय उपयोगी जानकारी होती है।

अगर हम यूनियनों का उपयोग करें:

struct data { 
    type_t type; 

    union payload { 
     int number; 
     char * string; 
     double fraction; 
     long long big_number; 
    } 
} 

फिर struct प्रकार प्लस पेलोड सदस्यों में से एक (यानी आप स्मृति की राशि type_t के आकार के बराबर आवंटित करेगा स्टोर करने के लिए केवल पर्याप्त जगह और साथ ही एक सबसे बड़ा संभव पेलोड सदस्य का आकार)। यह अंतरिक्ष का एक भार बचाता है और यह अधिक कुशल है।

आपको सावधान रहना होगा, क्योंकि अगर पेलोड में एक int है, तो भी आप इसे डबल के रूप में पढ़ सकते हैं।आपको शायद बेहद अजीब संख्या मिल जाएगी क्योंकि आपका प्रोग्राम गलत तरीके से डेटा की व्याख्या करने की कोशिश करता है

3

उन दिनों के अवशेष के रूप में जब 64 केबी बहुत मेमोरी थी, तो आपके पास सी ++ में एक सुविधा है जो एक से अधिक चर साझा करने की अनुमति देती है एक ही स्मृति (लेकिन जाहिर है, एक ही समय में नहीं)। यह एक संघ कहा जाता है, और वहाँ चार बुनियादी तरीके जिसमें आप एक का उपयोग कर सकते हैं:

  • आप इतना है कि एक चर एक एक कार्यक्रम है, जो बाद में है में एक बिंदु पर स्मृति का एक ब्लॉक पर उपयोग कर सकते हैं एक अलग प्रकार के एक अन्य चर बी द्वारा कब्जा कर लिया, क्योंकि ए अब आवश्यक नहीं है। मैं अनुशंसा करता हूं कि आप ऐसा न करें। यह ऐसी व्यवस्था में अंतर्निहित त्रुटि के जोखिम के लायक नहीं है। आप गतिशील रूप से स्मृति आवंटित करके एक ही प्रभाव प्राप्त कर सकते हैं।

  • वैकल्पिक रूप से, आपके पास ऐसे प्रोग्राम में स्थिति हो सकती है जहां डेटा की एक बड़ी श्रृंखला की आवश्यकता होती है, लेकिन आप निष्पादन के पहले से नहीं जानते कि डेटा प्रकार क्या होगा - यह इनपुट डेटा द्वारा निर्धारित किया जाएगा । मैं यह भी अनुशंसा करता हूं कि आप इस मामले में यूनियनों का उपयोग न करें, क्योंकि आप विभिन्न प्रकार के कुछ पॉइंटर्स का उपयोग करके एक ही परिणाम प्राप्त कर सकते हैं और फिर, स्मृति को गतिशील रूप से आवंटित कर सकते हैं।

  • संघ के लिए तीसरा संभव उपयोग एक ऐसा है जिसे आपको बार-बार आवश्यकता हो सकती है - जब आप दो या दो से अधिक अलग तरीकों से उसी डेटा की व्याख्या करना चाहते हैं। ऐसा तब हो सकता है जब आपके पास एक चर हो जो कि प्रकार का लंबा हो, और आप इसे दो प्रकार के मान के रूप में छोटा करना चाहते हैं। विंडोज कभी-कभी एक समारोह में पारित प्रकार के एक पैरामीटर में दो छोटे मानों को पैकेज करेगा। एक और उदाहरण तब उठता है जब आप संख्यात्मक डेटा वाले मेमरी के ब्लॉक को बाइट्स की स्ट्रिंग के रूप में देखना चाहते हैं, बस इसे चारों ओर ले जाने के लिए।

  • आप किसी ऑब्जेक्ट को किसी ऑब्जेक्ट या डेटा वैल्यू को पास करने के साधन के रूप में उपयोग कर सकते हैं, जहां आप पहले से नहीं जानते कि इसका प्रकार क्या होगा। संघ आपके पास होने वाली किसी भी प्रकार की संभावित श्रेणी को संग्रहीत करने के लिए प्रदान कर सकता है।

यदि आपको लगता है कि मैं यह समझाने में एक प्रतिभाशाली हूं कि संघ क्या है और इसके कुछ संभावित अनुप्रयोग हैं, तो मैं इसके लिए क्रेडिट नहीं ले सकता। (: यह जानकारी आईवर होर्टन के शुरुआती दृश्य सी ++ 2010 से आई है, जो कि मैं अपने डेस्क पर बैठा हूं। मुझे आशा है कि यह सहायक होगा।

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