2011-03-25 10 views
6

मैं समझ सकता हूं कि अगर वे रेखांकित हैं तो यह कैसे काम करता है। लेकिन अगर वे नहीं हैं, तो यह कैसे काम करता है? क्या सभी ऑब्जेक्ट फ़ाइलों को अपनी खुद की प्रतिलिपि मिलती है उदाहरण के लिए फ़ंक्शन टेम्पलेट वैसे भी?टेम्पलेट्स कैसे काम करते हैं, क्या वे हमेशा रेखांकित होते हैं?

+0

टेम्पलेट्स कोड जनरेशन के लिए हैं। यदि आप टेम्पलेट का उपयोग करते हैं तो कक्षा/फ़ंक्शन जेनरेट और उपयोग किया जाता है। कंपाइलर समान पैरामीटर के साथ टेम्पलेट्स के कई उदाहरणों को हटा सकता है, लेकिन इसकी गारंटी नहीं है। मुझे इनलाइनिंग के लिंक को नहीं दिख रहा है। – knivil

उत्तर

4

टेम्पलेट्स inline के मानक अर्थ है, में inlined किया जाएगा वास्तविक कोड इनलाइनिंग की तुलना में एक परिभाषा नियम से अधिक संबंधित है। यानी, लिंकर शिकायत नहीं करेगा अगर टेम्पलेट फ़ंक्शंस को एक से अधिक अनुवाद इकाई में परिभाषित किया गया है, तो यह केवल एक चुन देगा (सावधान रहें: यादृच्छिक एक, वर्तमान कंपेलर शिकायत नहीं करते हैं यदि आप विभिन्न अनुवाद इकाइयों में टेम्पलेट की विभिन्न परिभाषाएं प्रदान करते हैं!) और अंतिम बाइनरी में छोड़ दें।

अब, अन्य सभी inline फ़ंक्शंस के साथ, संकलक यह तय कर सकता है कि वास्तव में फ़ंक्शन कॉल से बचने और कॉल के स्थान पर फ़ंक्शन को इनलाइन करने का अच्छा विचार है, या यह निर्धारित कर सकता है कि यह इतना अच्छा नहीं है विचार (बड़ा फ़ंक्शन, कुछ कंपाइलर नेस्टेड लूप के साथ फ़ंक्शन इनलाइन नहीं करते हैं ... जो कुछ भी कारण है) और फिर यह वास्तविक कोड इनलाइनिंग नहीं करेगा।

+0

और संकलक "इनलाइन" घोषित नहीं किए गए कार्यों को "इनलाइन" करने का निर्णय ले सकता है। मैंने 'gcc' का उपयोग करते समय बाहरी लिंक के बिना कार्यों के लिए यह देखा है। – Raedwald

1

यह कार्यान्वयन निर्भर है।

लेकिन आम तौर पर, हाँ प्रत्येक ऑब्जेक्ट फ़ाइल का उपयोग किए गए प्रत्येक विस्तारित फ़ंक्शन की प्रति प्राप्त होती है। और फिर लिंकर लिंक समय पर नोटिस करता है और यह सुनिश्चित करता है कि फ़ंक्शन की केवल एक प्रति अंतिम निष्पादन योग्य फ़ाइल

2

संकलक पर निर्भर करती है, लेकिन मैंने जो भी देखा है, वह एक ऐसा फ़ंक्शन बनाता है जिसे कॉल करने योग्य है प्रत्येक भिन्नता के लिए कोड उत्पन्न करने के लिए प्रतिस्थापित टेम्पलेट पैरामीटर का उपयोग करना।

एक (बहुत) सरल उदाहरण के रूप में

:

template <typename T> T Max(T a, T b) 
{ 
    return a > b ? a : b; 
} 

कब और नहीं Max<int> और Max<float> के रूप में लागू किया और inlined संकलक उत्पन्न करता है (वे एक विशेष तरीके से सजाया जाता है तथापि, अन्य समस्याओं को रोकने के लिए):

int Max(int a, int b) 
{ 
    return a > b ? a : b; 
} 

float Max(float a, float b) 
{ 
    return a > b ? a : b; 
} 

यह तो वस्तु के शुरू में अटक और फिर संदर्भित है, तो एक ही कुछ inlines के लिए भी (MSVC में)

2

किया जाता है यह निर्भर करता है। कुछ अधिक लोकप्रिय कार्यान्वयन प्रत्येक ऑब्जेक्ट फ़ाइल में तत्काल कोड की एक प्रति उत्पन्न करते हैं जो एक त्वरण को ट्रिगर करता है, और लिंकर पर पर सभी को फेंक देता है। अन्य कंपाइलर भंडार का उपयोग करते हैं, जहां तत्काल संग्रहित होते हैं; यदि तत्कालता पहले से मौजूद है, तो संकलक को पुन: उत्पन्न करने से परेशान नहीं करता है। यह समाधान काफी तेज़ है और पहले समाधान की तुलना में कम डिस्क का उपयोग करता है, लेकिन यह पर भी बहुत कठिन है। (संकलक एक नया इन्स्टेन्शियशन उत्पन्न करने के लिए है न केवल करता है, तो एक मौजूद नहीं है, लेकिन फाइलों इन्स्टेन्शियशन पर निर्भर करता है में से किसी को बदल दिया है, तो।)

0

टेम्पलेट्स वास्तव में बहुत बहुत उन्नत मैक्रो (#define)

मानकों को पारित कर दिया मूल्यों के साथ संकलन समय पर बदल दिया जाता है कर रहे हैं। वास्तव में महान अवधारणा और भी बहुत स्वागत किया।

+0

मैक्रोज़ को बर्तन में टेम्पलेट्स के साथ मिश्रित नहीं किया जाना चाहिए और आप पहले से ही अपनी अवधारणाओं को भ्रमित कर सकते हैं: मैक्रोज़ को पहले अनुवाद चरण में विस्तारित किया जाता है, यानी, वे टोकन उत्पन्न कर सकते हैं जिन्हें सी ++ पार्सर में पास किया जाना है। टेम्पलेट्स के साथ यह संभव नहीं है। –

0

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

कंपाइलर आम तौर पर इनलाइन को अनदेखा करते हैं क्योंकि बहुत कम प्रोग्रामर वास्तव में यह जान सकते हैं कि यह सर्वोत्तम है और जो लोग असेंबली नहीं छोड़ते हैं।

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