2009-11-20 15 views
12

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

किसी के गंभीर रूप से सीमित संसाधनों एम्बेडेड सिस्टम के बाहर एक उदाहरण प्रदान कर सकते हैं जहां टेम्पलेट इन्स्टेन्शियशन ब्लोट अभ्यास में अहमियत और औसत दर्जे का, व्यावहारिक रूप से महत्वपूर्ण नकारात्मक प्रभाव पड़ा?

उत्तर

10

सी ++ में थोड़ी सी समस्या है, क्योंकि टेम्पलेट सामग्री की मात्रा सी ++ में कर सकती है उनकी जटिलता से सीमित है।

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

आजकल बेहतर है। लेकिन पूरी तरह से, टेम्पलेट्स अभी भी एक साधारण कारण के लिए बहुत अधिक ब्लोट का कारण बनते हैं - वे तेजी से विश्लेषण करते हैं और सी ++ की तुलना में अधिक शक्तिशाली होते हैं, इसलिए लोग स्वाभाविक रूप से उन्हें बहुत अधिक उपयोग करते हैं (यहां तक ​​कि ऐसे मामलों में जो तकनीकी रूप से टेम्पलेट्स की आवश्यकता नहीं है) । मुझे यह स्वीकार करना होगा कि मैं यहां प्रमुख अपराधियों में से एक हूं (यदि आप चाहें तो tools.base पर एक नज़र डालें, लेकिन एक बारफ बैग को आसान रखना सुनिश्चित करें - फ़ाइल प्रभावी रूप से 90% टेम्पलेट कोड है)।

3

मुझे लगता है कि अभ्यास में टेम्पलेट कोड ब्लोट देखने के लिए आपको पुराने कंपाइलर को खोजने की आवश्यकता होगी। आधुनिक सी ++ कंपाइलर्स (और लिंकर्स) थोड़ी देर के लिए इसे अनुकूलित करने में सक्षम हैं।

2

मुझे लगता है कि यह मुख्य रूप से मानसिक ब्लोट है। आपके कोड पर काम करने के लिए अगले प्रोग्रामर को पहले यह पता लगाने की आवश्यकता होगी कि इसका क्या सबसेट महत्वपूर्ण है।

7

टेम्पलेट ब्लोट कोई समस्या नहीं है (यह एक मानसिक समस्या कोड समस्या नहीं है)।

हां यह बड़ा हो सकता है। लेकिन विकल्प क्या है?
आप सभी कोड मैन्युअल रूप से लिख सकते हैं (एक बार प्रत्येक प्रकार के लिए)। क्या आपको लगता है कि इसे मैन्युअल रूप से लिखना इसे छोटा कर देगा। कंपाइलर केवल उन संस्करणों को कम करता है जिनकी वास्तव में आवश्यकता होती है और लिंकर संकलन इकाइयों पर फैली कई प्रतियों को हटा देगा।

तो कोई वास्तविक ब्लोट नहीं है।
यह सिर्फ आपके द्वारा उपयोग किए जाने वाले भवन का निर्माण कर रहा है। यदि आप कई अलग-अलग प्रकार का उपयोग करते हैं तो आपको अधिक कोड लिखना होगा।

+2

यह काफी सच नहीं है करने के लिए - संकलक विभिन्न कार्यों 'च (हस्ताक्षरित पूर्णांक)' और 'च <अहस्ताक्षरित int> (अहस्ताक्षरित int)' के लिए समान कोड उत्पन्न कर सकता है, और probabl y ध्यान नहीं देगा कि वे समान हैं। जबकि इसे मैन्युअल रूप से लिखना आपको केवल उन कार्यों में से एक प्राप्त होगा। –

+2

आदर्श रूप से आपको एक कंपाइलर/लिंकर का उपयोग करना चाहिए जो डुप्लिकेट जेनरेट असेंबली कोड को पहचानता और हटा देता है। विजुअल स्टूडियो वह करता है (COMDAT तह)। – vividos

+3

यह सच है यदि आप जेनिक्स के रूप में टेम्पलेट का उपयोग कर रहे हैं। लेकिन यदि आप टेम्पलेट्स के साथ मेटाप्रोग्रामिंग कर रहे हैं तो यह सच नहीं है। मेटाप्रोग्रामिंग में उपयोग किए गए टेम्पलेट्स सभी प्रकार के पागल इंटरमीडिएट प्रकारों को तुरंत चालू कर सकते हैं जिनकी आपको वास्तव में आवश्यकता नहीं है। मुझे लगता है कि बढ़ावा :: भावना पार्सर जेनरेटर इसका एक अच्छा उदाहरण हो सकता है। – Baxissimo

1

टेम्पलेट इंस्टॉलेशन ब्लोट अभ्यास में एक मामला है, क्योंकि यह बढ़ सकता है (बहुत !!!) संकलन और लिंक समय।

मैं व्यक्तिगत रूप से सोचता हूं कि C++ # 1 समस्या संकलित समय है, और यह मुख्य रूप से टेम्पलेट के कारण है।

मैंने लगभग 50 libs के साथ एक परियोजना पर काम किया। टेम्पलेट्स का उपयोग करके हमारी अपनी आरटीआई प्रणाली थी।मैं फिर से लिखने क्योंकि टेम्पलेट के ब्लोट

यहाँ था कुछ संख्या है:

  • libs 420 Mbytes
  • temps 2.9 Gbytes
  • पूर्ण से चला गया पुनर्निर्माण के लिए 4.3 Gbytes से चला गया करने के लिए 640 Mbytes से चला गया 19:30 13:10
+0

क्यों नीचे वोट ??? – benoitj

+0

"गेम प्रोजेक्ट" की तरह लगता है;) किसी भी तरह से अधिकांश पीसी गेम उस समस्या का सामना करते हैं, और अक्सर डेवलपर टेम्पलेट्स में समस्या को खोजते हैं। लेकिन हकीकत में समस्या सिर्फ सामान्य कोड bloat और गैर जिम्मेदार रूप से इस बात पर अधिक से अधिक libs फेंक रहा है। टेम्पलेट कोड द्वारा उत्पन्न कोड ब्लोट आमतौर पर केवल बकवास है। – Frunsi

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