खोज…


टिप्पणियों

यूनियन बहुत उपयोगी उपकरण हैं, लेकिन कुछ महत्वपूर्ण चेतावनी के साथ आते हैं:

  • यह C ++ मानक के अनुसार अपरिभाषित व्यवहार है, एक संघ के एक तत्व का उपयोग करने के लिए जो हाल ही में संशोधित सदस्य नहीं था। हालाँकि बहुत सारे C ++ कंपाइलर इस एक्सेस को अच्छी तरह से परिभाषित तरीकों से अनुमति देते हैं, ये एक्सटेंशन हैं और इन्हें कंपाइलर की गारंटी नहीं दी जा सकती।

    एक std::variant (C ++ 17 के बाद से) एक संघ की तरह है, केवल यह आपको बताता है कि इसमें वर्तमान में क्या शामिल है (इसके दृश्यमान राज्य का हिस्सा किसी दिए गए क्षण में रखे गए मूल्य का प्रकार है: यह केवल मूल्य पहुंच को लागू करता है उस प्रकार)।

  • कार्यान्वयन जरूरी नहीं कि विभिन्न आकारों के सदस्यों को एक ही पते पर संरेखित करें।

मूल संघ सुविधाएँ

यूनियन्स एक विशिष्ट संरचना है जिसके भीतर सभी सदस्य ओवरलैपिंग मेमोरी पर कब्जा कर लेते हैं।

union U {
    int a;
    short b;
    float c;
};
U u;

//Address of a and b will be equal
(void*)&u.a == (void*)&u.b;
(void*)&u.a == (void*)&u.c;

//Assigning to any union member changes the shared memory of all members
u.c = 4.f;
u.a = 5;
u.c != 4.f;

विशिष्ट उपयोग

अनन्य डेटा के लिए स्मृति उपयोग को कम करने के लिए यूनियन उपयोगी होते हैं, जैसे कि मिश्रित डेटा प्रकारों को लागू करते समय।

struct AnyType {
    enum {
        IS_INT,
        IS_FLOAT
    } type;
    
    union Data {
        int as_int;
        float as_float;
    } value;

    AnyType(int i) : type(IS_INT) { value.as_int = i; }
    AnyType(float f) : type(IS_FLOAT) { value.as_float = f; }

    int get_int() const {
        if(type == IS_INT)
            return value.as_int;
        else
            return (int)value.as_float;
    }
    
    float get_float() const {
        if(type == IS_FLOAT)
            return value.as_float;
        else
            return (float)value.as_int;
    }
};

अपरिभाषित व्यवहार

union U {
    int a;
    short b;
    float c;
};
U u;

u.a = 10;
if (u.b == 10) {
   // this is undefined behavior since 'a' was the last member to be
   // written to. A lot of compilers will allow this and might issue a
   // warning, but the result will be "as expected"; this is a compiler
   // extension and cannot be guaranteed across compilers (i.e. this is
   // not compliant/portable code).
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow