Maintaining an array of pointers in C that points to two related types -
मेरे पास एक संरचना है
struct चीजें {BOOL_T is_copy; / * झूठी है / संभाल 1 एच 1; संभाल 2 एच 2; Int n; शून्य * स्मृति; }; कभी-कभी मैं चीजों की वस्तुओं की एक प्रतिलिपि बनाते हैं नीचे संरचना struct copy_of_things {BOOL_T is_copy; / * सच है * / हैंड 1 एच 1; / * मुझे h2 और n की आवश्यकता नहीं है * / शून्य * स्मृति; / * चीजें ऑब्जेक्ट से कॉपी और चीजें ऑब्जेक्ट नई मेमोरी आवंटित करती हैं * / int another_member; }; इसके अलावा मेरे पास एक प्रबंधक में संरचना की एक सरणी है जो कि मेरे कार्यक्रम में रहने वाले सभी चीजें और copy_of_things संरचना को रखता है संरचना बातें * बातें_अरे [SIZE_OF_ARRAY]; )। मैं डिज़ाइन की आवश्यकताओं के कारण 2 एरे का प्रबंधन नहीं कर सकता (एरेज़ हैश के समान है) इसे सक्षम करने के लिए, मैंने इस सरणी के प्रकार को वस्तु * के रूप में बनाया और copy_of_things के प्रकार को नीचे बदल दिया गया है struct copy_of_things {struct बातें ths; Int another_member; }; अब मैं अपने सरणी तत्वों के is_copy सदस्य पढ़ सकता हूं और तय कर सकता हूं कि इसे things या copy_of_things । मुझे लगता है कि यह केवल स्मृति के संदर्भ में अक्षम नहीं है लेकिन बदसूरत देख रहा है। समाधान 2 मैं भी प्रकार के सरणी का उपयोग करने की योजना है संरचना प्रकार (is_copy) और एक संघ । struct चीजें {BOOL_T is_copy; संघ {संरचना {/ * is_copy = false * / handle1 h1; संभाल 2 एच 2; Int n; शून्य * स्मृति; } टी; Struct {/ * is_copy = true * / handle1 h1; शून्य * स्मृति; Int another_member; } सी; }; लेकिन समीक्षा करते समय मैंने यह डिजाइन भी बदसूरत पाया।
समाधान 3 मैं BOOL_T is_copy रखने की योजना बना रहा हूं; दोनों संरचना के पहले सदस्य के रूप में और प्रकार की सरणी रखें BOOL_T । BOOL_T की सामग्री को पढ़ने के बाद मैं अपने सूचक को चीजों पर प्रतिलिपि कर सकता हूं या कॉपी_ओफ़_थिंग्स मुझे यकीन नहीं है कि यह एक अच्छा समाधान है और एक अच्छी तरह से परिभाषित व्यवहार प्रदान करता है (अनुकूलन के उच्च स्तर पर) जैसा कि एक ही पते को विभिन्न प्रकार के रूप में समझा जाता है। प्रश्न मेरी समस्या का बेहतर समाधान जो किसी भी प्लेटफ़ॉर्म पर पोर्टेबल है। संपादित करें
उत्तर के लिए धन्यवाद इसलिए दो सुझाव दिए गए हैं। - यूनियनों का उपयोग करें: दृष्टिकोण के नकारात्मक पक्ष में, प्रतियों के लिए अधिक स्मृति की आवश्यकता होती है मेरे मामले में
sizeof copy_of_things काफी sizeof things से छोटा है एक वर्कअराउंड को केवल पर्याप्त बाइट आवंटित किया जाएगा जिसमें वास्तविक ऑब्जेक्ट निवास कर सकता है। - एक सामान्य संरचना का उपयोग करें और इसे पहले दोनों
copy_of_things और चीजें । यहां मैं 2 प्रकारों के साथ एक ही स्मृति स्थान को डी-रेफ्रेंस करना समाप्त कर दूँगा (संरचना सामान्य और स्ट्रक्चर चीजें या स्ट्रक्चर कॉपी_ओफ़_थिंग्स)। मुझे यकीन नहीं है कि मुझे काट नहीं देगा। - एक और समाधान दोनों structs के पहले सदस्य को
char is_copy; / * \ 0 अगर कोई प्रतिलिपि नहीं है, अन्यथा शून्य नहीं है और पॉइंटर को केवल char * या चीजें * या copy_of_things * । अभी भी खुला प्रश्न
मैंने कई स्थानों पर इस्तेमाल किया समाधान 2 देखा है। क्या यह सख्त अलियासिंग नियम सुरक्षित है? क्या मेरी समस्याओं का बेहतर समाधान है क्योंकि कोड को विभिन्न प्रकार के कंपाइलर पर संकलित किया जाएगा रिवर्स मानचित्रण सरणी का आकार बड़ा है इसलिए मैं एक यूनियन या समाधान का उपयोग करने से बचा रहा हूँ जो रिवर्स मानचित्रण के आकार को बढ़ाता है। चीजों की संख्या (और प्रतिलिपि) कम है, इसलिए वहां नए डेटा सदस्य को जोड़ने के लिए ठीक है।
आप इन संरचनाओं के कुछ सदस्यों को अधिक कॉम्पैक्ट संघ के साथ साझा कर सकते हैं:
struct चीजें {BOOL_T is_copy; संभाल 1 एच 1; शून्य * स्मृति; संघ {संरचना {/ * is_copy = false * / handle2 h2; Int n; } टी; Struct {/ * is_copy = true * / int another_member; } सी; };
Comments
Post a Comment