2009-12-02 10 views
21

मैं/Gy विकल्प देखता हूं और सोच रहा हूं कि मैं इसका उपयोग क्यों करूंगा? http://msdn.microsoft.com/en-us/library/xsa71f43.aspxCOMDAT अनुभाग के लिए क्या उपयोग किया जाता है?

+0

[फंक्शन-लेवेल लिंकिंग (/ वीसी ++ में जीई स्विच) के संभावित डुप्लिकेट - यह क्या अच्छा है?] (Http://stackoverflow.com/questions/629894/function-level-linking-gy-switch-in -vc-what-is-it-good-for-0) –

उत्तर

68

currently accepted answer कुछ हद तक अधूरा है।

COMDAT अनुभाग का उद्देश्य एकाधिक ऑब्जेक्ट फ़ाइलों में "डुप्लिकेट" खंडों को परिभाषित करने की अनुमति देना है। आम तौर पर, यदि एक ही प्रतीक एकाधिक ऑब्जेक्ट फ़ाइलों में परिभाषित किया गया है, तो लिंकर त्रुटियों की रिपोर्ट करेगा। इससे कुछ सी ++ भाषा विशेषताओं जैसे टेम्पलेट्स की समस्याएं हो सकती हैं, जो अलग-अलग सीपीपी फ़ाइलों में समान प्रतीकों को तुरंत चालू कर सकती हैं।

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

किसी भी मामले में, currently accepted answer के विपरीत, कहा गया है कि कोई COMDAT अनुभाग की सामग्री के बारे में कोई आवश्यकता नहीं है, एक तरफ या दूसरा नहीं है। उनमें एक प्रक्रिया, कई प्रक्रियाओं, डेटा, या कोड और डेटा दोनों के संयोजन शामिल हो सकते हैं।

5

/Gy विकल्प रिलीज बिल्ड में उपयोग करने के लिए अच्छा है। 'क्योंकि प्रत्येक फ़ंक्शन का अपना अनुभाग होता है, लिंकर कोड के हर अप्रयुक्त टुकड़े को छोड़ सकता है। यदि आप/Gy विकल्प निर्दिष्ट नहीं करते हैं तो आपको कुछ ऐसा मिलेगा: "a.cpp" 3 कार्यों को परिभाषित करता है और संकलक संकलन करते समय उन्हें एक कोड अनुभाग में रखता है। "main.cpp" "a.cpp" से केवल एक फ़ंक्शन का उपयोग करता है, लेकिन "a.cpp" से सभी फ़ंक्शंस को लिंक करते समय (उनमें से दो बोझ के रूप में) लिंक किए जाएंगे। और यदि प्रत्येक समारोह में इसका स्वयं का अनुभाग होता है, तो लिंकर केवल एक ही चुन सकता है जिसमें "main.cpp" द्वारा आवश्यक फ़ंक्शन शामिल होता है। डिबग बिल्ड के लिए बिना/Gy विकल्प संकलन अच्छा है। कक्षा को संकलित करते समय, इसके सभी तरीकों को डिफ़ॉल्ट रूप से अपने स्वयं के अलग-अलग अनुभाग प्राप्त होते हैं।

+3

यह पुराना है, लेकिन किसी की जानकारी के लिए: यह नहीं है कि लिंकर कैसे काम करता है। एक बिल्कुल अलग स्विच है जो असुरक्षित कार्यों को नियंत्रित करता है:/ओपीटी: आरईएफ (अनुकूलन-> संदर्भ: हां)। इसके तहत एक और अधिकार है जो समान कार्यों में विलय करता है,/ओपीटी: आईसीएफ। आईसीएफ केवल/जी के साथ काम करता है, लेकिन आरईएफ इसके साथ या इसके बिना काम करता है। – SilverbackNet

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