2011-04-04 15 views
11

क्या संकलक के लिए कई अनुवाद इकाइयों में एक ही टेम्पलेट के तत्काल डुप्लिकेट करना संभव है?डुप्लिकेट सी ++ टेम्पलेट इंस्टॉलेशन

उदाहरण के लिए, यदि आपके पास a.cpp है जो किसी फ़ंक्शन के अंदर std:vector<int> का उपयोग करता है, और b.cpp के लिए एक ही चीज़ है, तो अंतिम बाइनरी में दो बार std::vector<int> होने का जोखिम है?

+0

हां। यह जोखिम नहीं है। आपको ऐसा क्यों लगता है कि यह जोखिम है? (जब तक आप एक अलग संकलन इकाई, AFAICT) में विधि निकाय को स्पष्ट रूप से परिभाषित नहीं करते हैं, तब तक उन्हें बाहरी संबंध नहीं मिलेगा। – sehe

उत्तर

5
के दोनों संकलन, जबकि ठीक उसी इन्स्टेन्शियशन का प्रबंधन करने

जैसा कि धारणा कहता है, अंतिम बाइनरी में केवल एक तात्कालिकता होगी। लेकिन जब भी संकलन इकाई में सामना किया जाता है तब भी टेम्पलेट्स को तुरंत चालू किया जाएगा। यदि आप कुछ संकलन गति चाहते हैं, तो सी ++ 0x में हमें extern template एस मिलता है। यह सामान्य extern चर की तरह काम करता है, जिसमें इसे कम से कम एक संकलन इकाई में निर्दिष्ट किया जाना चाहिए, लेकिन संकलक इस इकाई में टेम्पलेट को तुरंत चालू नहीं करेगा। अधिक जानकारी के लिए here और this draft (14.7.2 [temp.explicit]) देखें।

6

यह तब हो सकता है जब परियोजना संकलित की जा रही हो, तो अलग .obj फ़ाइलों में एक ही तत्कालता की प्रतियां होंगी। जब बाइनरी लिंकर से जुड़ा होता है तो तत्कालता की सभी अनावश्यक प्रतियों को खत्म कर देगा, इसलिए अंत बाइनरी में केवल एक प्रति होगी।

0

मुझे लगता है कि संकलक सामान्य कक्षाओं के सदस्य कार्यों के समान तंत्र का उपयोग करता है। यह उन्हें inline बना सकता है और मुझे लगता है कि यह उस जानकारी को छोड़ देता है जो लिंकर अंतिम बाइनरी के लिए इसे सॉर्ट करने के लिए उपयोग करता है। कि एक टेम्पलेट की 'इन्स्टेन्शियशन' है - -

फर्क सिर्फ इतना है कि संकलक 'लिखते हैं' परिभाषा है, लेकिन इसे a.cpp या b.cpp

0

यह संभव है, लेकिन केवल तभी जब आप उन्हें स्पष्ट रूप से दृष्टांत है, लेकिन फिर आप एक लिंकर त्रुटियां मिलेंगी:

// header.hpp 
template< typename T > 
class A 
{ 
}; 

// source1.cpp 
template class A<int>; 

// source2.cpp 
template class A<int>; 

आप स्पष्ट रूप से instantiating नहीं कर रहे हैं टेम्पलेट्स, तो किसी भी सभ्य लिंकर आसानी से प्रतियां समाप्त करेंगे।

+0

मुझे कोई त्रुटि नहीं मिल रही है (संकलित या लिंक) जब मैं g ++ -std-C++ 11 उन तीन फ़ाइलों (मैंने एक मुख्य() को एक में रखा है।) मैं मानता हूं कि एक से अधिक स्पष्ट तत्कालता दिखाई देने पर त्रुटि होनी चाहिए (दस्तावेज़ों के अनुसार: http://en.cppreference.com/w/cpp/language/class_template –

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