2010-09-03 12 views
6

बड़ी टेम्पलेट परियोजनाएं संकलित करने में धीमी हैं, एसटीएल इसका मुख्य अपराधी है, यह अनुभवजन्य साक्ष्य से लगता है। लेकिन, संकलन धीमा क्यों है?टेम्पलेट संकलित करने के लिए इतने धीमे क्यों हैं?

मैं अनुकूलन किया है हैडर शामिल के लिए देख कर और संकलन इकाइयों के संयोजन से पहले बनाता है, लेकिन मैं नहीं मिलता है क्यों टैम्पलेट लाइब्रेरियों काफी इतना संकलित करने के लिए धीमी गति से कर रहे हैं।

उत्तर

4

सी ++ कोड उत्पन्न करने के लिए टेम्पलेट कोड को दूसरी भाषा के रूप में लिया जाना है।

सोचने के तरीके में, टेम्पलेट कोड को पार्स किया जाना चाहिए, निष्पादित किया गया है, तो संकलक सी ++ कोड उत्पन्न कर सकता है जिसे वर्तमान इकाई फ़ाइल में जोड़ा जाना है, और फिर हम पूरे सी ++ कोड को संकलित कर सकते हैं।

मैंने सुना है कि सभी कंपाइलर्स यह बिल्कुल नहीं करते हैं लेकिन यह मुख्य विचार है, और ऐसा लगता है कि वास्तव में कोड को संकलित करने से पहले बहुत कुछ हो रहा है क्योंकि कुछ कोड पहले उत्पन्न किए जाने हैं।

1

उत्तर का हिस्सा आपके प्रश्न में है। आप हेडर के लिए टेम्पलेट्स के साथ शामिल नहीं देख सकते हैं, क्योंकि पूर्ण कार्यान्वयन को प्रत्येक संकलन इकाई में शामिल किया जाना चाहिए जो उनका उपयोग करता है।

12

सी ++ सामान्य रूप में, क्योंकि प्राचीन का संकलन करने में धीमी गति से तंत्र है, जो संकलक रिकर्सिवली अपने सभी घोषणाओं और परिभाषाओं के साथ हर हेडर फिर से पार्स करने के लिए कारण बनता है और सभी यह है कि हर अनुवाद इकाई के लिए शामिल किया गया है शामिल है।

टेम्पलेट्स बस उस "फीचर" पर बनाते हैं। लेकिन वे की आवश्यकता होती है सभी कोड भी संकलक के लिए मजबूर भी सभी कार्यान्वयन सभी टेम्पलेट्स के शामिल फिर से पार्स करने के लिए हेडर में रखना चाहते हैं।

+5

जब आप पहले कुछ बार जवाब देते हैं, तो एक बॉक्स आपको यह बताने के लिए तैयार करता है कि आपने ऐसा क्यों किया। थोड़ी देर के बाद यह और नहीं होता है। हालांकि, ऐसा इसलिए नहीं है क्योंकि आपको अब-वोटों की व्याख्या नहीं करनी चाहिए, लेकिन क्योंकि आपको तब तक यह जानने की आवश्यकता है। इसे साहसपूर्वक कहने के लिए: __ आपको अभी भी समझा जाना चाहिए कि आप नीचे क्यों मतदान करते हैं .__ – sbi

+0

सुनिश्चित नहीं है, लेकिन शायद एक सी फैनबॉय आया और सोचा "प्राचीन में तंत्र शामिल है ठीक है, सी इसके साथ पर्याप्त तेज़ी से संकलित करता है" – jalf

+0

प्रीकंपील्ड हेडर इसे हल करने में मदद करते हैं समस्या - आप पूरे एसटीएल precompiled हो सकता है तो यह एक परियोजना संकलित करते समय केवल एक बार पार्स किया गया है। – AshleysBrain

1

क्या एक वास्तविक दुनिया टेम्पलेट है के बारे में सोचो - यह एक वास्तविक बात नहीं है, लेकिन कैसे वास्तविक चीजों का निर्माण करने पर निर्देशों।

सी ++ टेम्पलेट्स के मामले में, हेडर फाइल एक वास्तविक शामिल नहीं करता है, उदा 'वेक्टर', लेकिन vector बनाने के निर्देशों पर निर्देश। हर बार जब हम एक स्रोत फ़ाइल है कि #include रों <vector>, संकलक अगर हम instantiating कर रहे हैं विभिन्न टेम्पलेट मानकों के साथ vector नए vector कोड, शायद कई बार निर्माण करने के लिए है निर्माण।

प्रत्येक स्रोत फ़ाइल का निर्माण स्वतंत्र है, और यह नहीं पता कि आपने पहले से ही किसी अन्य स्रोत फ़ाइल के लिए vector बनाया है, इसलिए यह हर बार एक नया बनाता है।

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