मैं समझ सकता हूं कि अगर वे रेखांकित हैं तो यह कैसे काम करता है। लेकिन अगर वे नहीं हैं, तो यह कैसे काम करता है? क्या सभी ऑब्जेक्ट फ़ाइलों को अपनी खुद की प्रतिलिपि मिलती है उदाहरण के लिए फ़ंक्शन टेम्पलेट वैसे भी?टेम्पलेट्स कैसे काम करते हैं, क्या वे हमेशा रेखांकित होते हैं?
उत्तर
टेम्पलेट्स inline
के मानक अर्थ है, में inlined किया जाएगा वास्तविक कोड इनलाइनिंग की तुलना में एक परिभाषा नियम से अधिक संबंधित है। यानी, लिंकर शिकायत नहीं करेगा अगर टेम्पलेट फ़ंक्शंस को एक से अधिक अनुवाद इकाई में परिभाषित किया गया है, तो यह केवल एक चुन देगा (सावधान रहें: यादृच्छिक एक, वर्तमान कंपेलर शिकायत नहीं करते हैं यदि आप विभिन्न अनुवाद इकाइयों में टेम्पलेट की विभिन्न परिभाषाएं प्रदान करते हैं!) और अंतिम बाइनरी में छोड़ दें।
अब, अन्य सभी inline
फ़ंक्शंस के साथ, संकलक यह तय कर सकता है कि वास्तव में फ़ंक्शन कॉल से बचने और कॉल के स्थान पर फ़ंक्शन को इनलाइन करने का अच्छा विचार है, या यह निर्धारित कर सकता है कि यह इतना अच्छा नहीं है विचार (बड़ा फ़ंक्शन, कुछ कंपाइलर नेस्टेड लूप के साथ फ़ंक्शन इनलाइन नहीं करते हैं ... जो कुछ भी कारण है) और फिर यह वास्तविक कोड इनलाइनिंग नहीं करेगा।
और संकलक "इनलाइन" घोषित नहीं किए गए कार्यों को "इनलाइन" करने का निर्णय ले सकता है। मैंने 'gcc' का उपयोग करते समय बाहरी लिंक के बिना कार्यों के लिए यह देखा है। – Raedwald
यह कार्यान्वयन निर्भर है।
लेकिन आम तौर पर, हाँ प्रत्येक ऑब्जेक्ट फ़ाइल का उपयोग किए गए प्रत्येक विस्तारित फ़ंक्शन की प्रति प्राप्त होती है। और फिर लिंकर लिंक समय पर नोटिस करता है और यह सुनिश्चित करता है कि फ़ंक्शन की केवल एक प्रति अंतिम निष्पादन योग्य फ़ाइल
संकलक पर निर्भर करती है, लेकिन मैंने जो भी देखा है, वह एक ऐसा फ़ंक्शन बनाता है जिसे कॉल करने योग्य है प्रत्येक भिन्नता के लिए कोड उत्पन्न करने के लिए प्रतिस्थापित टेम्पलेट पैरामीटर का उपयोग करना।
एक (बहुत) सरल उदाहरण के रूप में:
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 में)
किया जाता है यह निर्भर करता है। कुछ अधिक लोकप्रिय कार्यान्वयन प्रत्येक ऑब्जेक्ट फ़ाइल में तत्काल कोड की एक प्रति उत्पन्न करते हैं जो एक त्वरण को ट्रिगर करता है, और लिंकर पर पर सभी को फेंक देता है। अन्य कंपाइलर भंडार का उपयोग करते हैं, जहां तत्काल संग्रहित होते हैं; यदि तत्कालता पहले से मौजूद है, तो संकलक को पुन: उत्पन्न करने से परेशान नहीं करता है। यह समाधान काफी तेज़ है और पहले समाधान की तुलना में कम डिस्क का उपयोग करता है, लेकिन यह पर भी बहुत कठिन है। (संकलक एक नया इन्स्टेन्शियशन उत्पन्न करने के लिए है न केवल करता है, तो एक मौजूद नहीं है, लेकिन फाइलों इन्स्टेन्शियशन पर निर्भर करता है में से किसी को बदल दिया है, तो।)
टेम्पलेट्स वास्तव में बहुत बहुत उन्नत मैक्रो (#define)
मानकों को पारित कर दिया मूल्यों के साथ संकलन समय पर बदल दिया जाता है कर रहे हैं। वास्तव में महान अवधारणा और भी बहुत स्वागत किया।
मैक्रोज़ को बर्तन में टेम्पलेट्स के साथ मिश्रित नहीं किया जाना चाहिए और आप पहले से ही अपनी अवधारणाओं को भ्रमित कर सकते हैं: मैक्रोज़ को पहले अनुवाद चरण में विस्तारित किया जाता है, यानी, वे टोकन उत्पन्न कर सकते हैं जिन्हें सी ++ पार्सर में पास किया जाना है। टेम्पलेट्स के साथ यह संभव नहीं है। –
टेम्पलेट्स स्वयं के लिए एक पूरी भाषा हैं। वे ट्यूरिंग पूर्ण हैं, लेकिन "प्रोग्राम" संकलन समय पर चलता है। वे कोड कारखानों हैं जो संकलन समय पर ऑब्जेक्ट प्रकार को प्रतिस्थापित करते हैं और कक्षाओं, कार्यों आदि को इकट्ठा करते हैं।तो आप इसे एक प्रकार के सुरक्षित, सी ++ संगत बड़े पैमाने पर प्रीप्रोकैसिंग भाषा के रूप में सोच सकते हैं। निष्पादन का परिणामी आउटपुट शुद्ध सी ++ कोड है जिसे तब संकलक द्वारा उसी तरह किया जा सकता है जैसा कि यह सब कुछ करता है।
कंपाइलर आम तौर पर इनलाइन को अनदेखा करते हैं क्योंकि बहुत कम प्रोग्रामर वास्तव में यह जान सकते हैं कि यह सर्वोत्तम है और जो लोग असेंबली नहीं छोड़ते हैं।
- 1. विंडो हुक - वे कैसे काम करते हैं?
- 2. क्या .NET फ़ाइनलाइज़र हमेशा निष्पादित होते हैं?
- 3. क्या रैवल हमेशा स्थिर होते हैं?
- 4. गिट रूट शाखाएं ... वे कैसे काम करते हैं?
- 5. क्या ये 2 knapsack एल्गोरिदम समान हैं? (क्या वे हमेशा एक ही चीज़ आउटपुट करते हैं)
- 6. NSNotificationCenter: क्या ऑब्जेक्ट्स को उसी थ्रेड पर नोटिफिकेशन प्राप्त होते हैं जिन्हें वे पोस्ट करते हैं?
- 7. AJAX बैक बटन कार्यान्वयन: वे कैसे काम करते हैं?
- 8. स्कैला के आलसी तर्क: वे कैसे काम करते हैं?
- 9. गिट हुक और वे कैसे काम करते हैं
- 10. कैटमुल-रोम splines - वे कैसे काम करते हैं?
- 11. निर्भरता इंजेक्शन फ्रेमवर्क: वे कैसे काम करते हैं?
- 12. हास्केल में जटिल डेटा संरचनाएं - वे कैसे काम करते हैं?
- 13. सी अंतर्निहित रूपांतरण क्यों करते हैं जैसे वे करते हैं?
- 14. '__exidx_start' और '__exidx_end' वे क्या करते हैं?
- 15. वीबीएनईटी वैकल्पिक पैरामीटर कैसे 'हुड के तहत' काम करते हैं? क्या वे सीएलएस-अनुरूप हैं?
- 16. एनोटेशन क्या हैं और वे वास्तव में वसंत जैसे ढांचे के लिए कैसे काम करते हैं?
- 17. डीएलएल फाइलें वास्तव में क्या हैं, और वे कैसे काम करते हैं?
- 18. ग्रीनलेट कैसे काम करते हैं?
- 19. थ्रेडिंग बनाम समांतरता, वे अलग कैसे होते हैं?
- 20. क्या डेटाग्राम हमेशा पूरी तरह से प्राप्त होते हैं?
- 21. GUID के बारे में प्रश्न: क्या वे हमेशा लंबाई में तय होते हैं, और हमेशा मध्य संख्या 4 है?
- 22. फेसबुक एनीमेशन वे यह कैसे करते हैं?
- 23. कुकीज कैसे काम करते हैं?
- 24. क्या मर्कुरियल बेहतर काम करते हैं जब परिवर्तन छोटे होते हैं?
- 25. fgetcsv() विशेष वर्णों को अनदेखा करते हैं जब वे लाइन की शुरुआत में होते हैं!
- 26. त्रिकोणमितीय कार्य कैसे काम करते हैं?
- 27. कंप्यूटर्स शेडर्स, वे पाइपलाइन में कहां फिट होते हैं?
- 28. PHP सत्र कैसे काम करते हैं? (नहीं "वे कैसे उपयोग किए जाते हैं?")
- 29. एक्जिक्यूटिव कैसे काम करते हैं?
- 30. परीक्षक क्या करते हैं?
टेम्पलेट्स कोड जनरेशन के लिए हैं। यदि आप टेम्पलेट का उपयोग करते हैं तो कक्षा/फ़ंक्शन जेनरेट और उपयोग किया जाता है। कंपाइलर समान पैरामीटर के साथ टेम्पलेट्स के कई उदाहरणों को हटा सकता है, लेकिन इसकी गारंटी नहीं है। मुझे इनलाइनिंग के लिंक को नहीं दिख रहा है। – knivil