2010-07-09 5 views
7

मैं देखते रहो, लेकिन ऐसा लगता है कि इन के समर्थन में संकलक डेवलपर्स से शून्य ब्याज है जैसे।क्या कोई मुख्यधारा के कंपाइलर निकट भविष्य में सी ++ 0x अप्रतिबंधित संघों का समर्थन करने की संभावना है?

मेरे लिए, यह अजीब लगता है - मूल रूप से, वर्तमान सी ++ यूनियनों, जो हमेशा किसी जलन और कभी नहीं उपयुक्त थे पर प्रतिबंध है। आपको लगता है कि मूल रूप से कुछ त्रुटि जांच को निकालने के लिए एक अतिरिक्त सी ++ 0x समर्थन बॉक्स को चेक करने का अपेक्षाकृत सरल तरीका होगा, लेकिन AFAICT कोई कंपाइलर डेवलपर अभी तक ऐसा नहीं कर पाए हैं।

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

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

union Memory_For_Item_t 
{ 
    Item_t m_Item; 
}; 
यहां तक ​​कि C++ 0x में मानकीकृत संरेखण हैंडलिंग सुविधाओं के साथ

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

अप्रतिबंधित यूनियनों के साथ ही समस्या - वहाँ उनके लिए कोई समर्थन है कि मैं मिल सकता है।

उत्तर

4

निकट भविष्य? मैं उस पर भरोसा नहीं करता। http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport अच्छी तरह से बताता है, वर्तमान कंपेलरों में से कोई भी इसका समर्थन नहीं करता है, भले ही सी ++ 0x सुविधाओं पर कई लागू किए जा रहे हों।

हालांकि N2544 बताते हैं के रूप में:

वर्तमान काम के आसपास संघ सीमाओं के टेम्पलेट प्रोग्रामिंग या डाले का उपयोग कर एक नकली संघ बनाने के लिए है।

तो, जिस स्थिति में आप वर्णन कर रहे हैं वह शायद पहले से ही एक समाधान है, हालांकि थोड़ा गन्दा है।

+0

हाँ - मेरे पास अब एक टेम्पलेट दृष्टिकोण है, लेकिन यह कंप्रेसर और अन्य नास्टनेस की पहचान करने के लिए प्रीप्रोसेसर सशर्त पर निर्भर करता है, मुख्य रूप से संरेखण को सही तरीके से संभालने के लिए। आओ यह भंगुर और आम तौर पर बुरा है, और जितनी जल्दी मैं इसे बेहतर बदल सकता हूं। – Steve314

+0

हम्म - इट्रेस्टिंग टेबल, लेकिन केवल तीन पूरी तरह खाली रिक्त पंक्तियों में से एक को केवल उस सुविधा के लिए होना चाहिए जिसकी मैं सबसे अधिक उम्मीद कर रहा हूं। ओह ठीक है - lamda अभिव्यक्तियों और बंद हो जाएगा अच्छा, मुझे लगता है। – Steve314

1

हाँ - मैं अब एक टेम्पलेट दृष्टिकोण है, लेकिन यह सशर्त, पूर्वप्रक्रमक पर निर्भर करता है संकलनकर्ता और अन्य गंदगी की पहचान के लिए, मुख्य रूप से संरेखण सही से निपटने के लिए। IOW यह भंगुर और आम तौर पर बुरा

आप क्यों नहीं बस boost::variant का उपयोग नहीं करते है? यदि आप बूस्ट का उपयोग नहीं कर रहे हैं और आप पहले से ही C++ 0x का उपयोग कर रहे हैं तो std::alignment_of/std::aligned_storage जैसे टाइप गुणों का उपयोग करें जो मानक और क्रॉस-प्लेटफ़ॉर्म हैं और यदि आपका कंपाइलर अब उनका समर्थन करता है तो आप विविध टेम्पलेट का उपयोग कर सकते हैं। टेम्पलेट का उपयोग करें प्रकार सूची आदि

+0

मेरा टेम्पलेट बूस्ट :: संस्करण को काफी हद तक पूर्ववत करता है। कुछ बूस्ट फीचर या सी ++ 0 एक्स फीचर के साथ सभी उपयोगों को प्रतिस्थापित करना जो आदर्श नहीं है, केवल बाद में इसे प्रतिस्थापित करने के लिए, थोड़ा सा व्यर्थ है। मैं सी ++ 0x का उपयोग नहीं कर रहा हूं - बस एक विशेष सुविधा का उपयोग करने में सक्षम होने की उम्मीद कर रहा हूं। अंत में "केवल बूस्ट का उपयोग करें" वास्तव में जादू तत्काल फिक्स नहीं है जिसे आप इसे बनाने के लिए बनाते हैं - फिर भी एक और निर्माण निर्भरता इत्यादि इत्यादि। यदि इसका दीर्घकालिक मूल्य था तो ठीक है, लेकिन चीजें खड़े होने पर मैं केवल वही करूँगा जो मैं करूँगा मैं तब तक कर रहा हूं जब तक अप्रतिबंधित संघ चालू न हो जाए। – Steve314

+0

@ स्टीव 314 यह व्यर्थ नहीं है, यह वास्तव में इस बात पर निर्भर करता है कि आप यूनियनों का उपयोग किस प्रकार कर रहे हैं, यदि आप इसे बीजगणित डेटा-प्रकार उर्फ ​​भेदभाव/टैग किए गए यूनियन की तरह उपयोग करने जा रहे हैं तो यह कच्चा नहीं है क्योंकि सामान्य) संघ के रूप में काम करने के लिए उपयोगी नहीं है। जैसी चीजें हैं :: वेरिएंट सामान्य रूप से सी ++ 0x में सामान्यीकृत यूनियनों के अनियंत्रित या नहीं। –

+0

@ स्टीव 314 "मैं कन्स्ट्रक्टर इत्यादि के बिना किसी विशेष प्रकार के लिए स्मृति को आरक्षित करने का एक तरीका ढूंढ रहा हूं" आपको इसके लिए एक संघ की आवश्यकता नहीं है, जो आप चाहते हैं ** प्लेसमेंट ** नया ऑपरेटर जो केवल है निर्माण के लिए इस्तेमाल किया और स्पष्ट रूप से सही समय पर विनाशक को बुलाया। यदि आप अनियमित स्मृति का प्रबंधन कर रहे हैं तो आपको अभी भी संरेखण के मुद्दों से सावधान रहना होगा और यही कारण है कि आप प्रकार के लक्षणों का उपयोग कर सकते हैं, बढ़ावा संरेखण निर्धारित करने के लिए प्रकार के गुण प्रदान करते हैं और संकलित समय पर संकलित समय उत्पन्न करते हैं, यह वास्तव में क्रॉस-प्लेटफॉर्म पर है इस प्रकार boost :: संस्करण नीचे काम करता है। –

3

जीसीसी अब यह सूचीबद्ध करता है version 4.6 में समर्थित के रूप में में सबसे बड़ा प्रकार गणना करने के लिए मेटा प्रोग्रामिंग। ऐसा लगता है कि जुलाई 14, this patch के साथ जुलाई 14 को पेश किया गया था। भविष्य अब यह है कि।

+0

जैसे, वाह ... दोस्त। –

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