2011-06-22 9 views
5

यह किस प्रकार का बुरा जादू करने की कोशिश कर रहा है!अवधारणाओं को सी ++ संकलन धीमा क्यों करता है?

मैं Q&A session with herb sutter पर सुन रहा था और एक प्रश्न अवधारणाओं के बारे में था। हर्ब का उल्लेख है कि यह संकलक धीमा कर दिया गया है (जबकि स्रोत अपरिवर्तित बनी हुई है) और खंड टेम्पलेट्स पर अनुभाग के बाद काफी बड़ा था।

ऐसा क्यों करता है? मुझे अवधारणाओं पर दस्तावेज़ीकरण कहां मिल सकता है?

उत्तर

9

सबसे पहले, हर्ब ने यह नहीं कहा कि अवधारणाओं ने खुद को धीमा संकलित किया है। उन्होंने कहा कि सी ++ मानक लाइब्रेरी को संकल्पनात्मक रूप से सी ++ मानक लाइब्रेरी संकलन धीमी गति से उपयोग करके कोई कोड बनाया गया है।

इसका कारण कई चीजों से नीचे आता है।

1: अवरोध टेम्पलेट संकलन समय लेता है।

जब आप इस तरह एक वर्ग की घोषणा:

template<typename T> class Foo {...}; 

संकलक बस फू पार्स करता है और बहुत कम करता है। दो चरण के लुकअप के साथ भी, कंपाइलर क्लास फू के संकलन में पूरी तरह से नहीं करता है। यह बाद में, इसके लिए स्टोर करता है, लेकिन प्रारंभिक पास अपेक्षाकृत तेज़ है।

जब आप एक अवधारणा के साथ टेम्पलेट विवश करते हैं:

template<ConceptName C> class Foo {...}; 

संकलक कुछ बातें करना चाहिए। इसे आगे की जांच करनी चाहिए कि C के प्रत्येक उपयोग अवधारणा ConceptName के अनुरूप है। यह अतिरिक्त काम है कि संकलक तत्काल समय तक स्थगित हो गया होगा।

आपके पास जितनी अधिक अवधारणा की जांच है, उतना अधिक संकलित समय जिसे आप यह सत्यापित करने के लिए खर्च करते हैं कि प्रकार अवधारणाओं से मेल खाते हैं।

2: मानक सी ++ पुस्तकालय कई अवधारणाओं का उपयोग करता है।

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

और इसमें रेंज अवधारणाएं शामिल नहीं हैं (जिनमें से आउटपुट को छोड़कर हर प्रकार की इटरेटर अवधारणा के लिए एक है), std :: स्ट्रिंग के लिए चरित्र अवधारणाएं, और कई अन्य प्रकार की चीजें शामिल हैं। इन सभी को संकलित और जांचना होगा।


क्या अवधारणाओं वास्तव में यह तेजी से बनाने के लिए आवश्यक मॉड्यूल है। कंपाइलर को मॉड्यूल फ़ाइल जेनरेट करने की क्षमता जिसमें प्री-चेक किए गए प्रतीकों का अनुक्रम होता है, और तब मानक संकलन प्रक्रिया के बिना सीधे उस फ़ाइल को लोड करें। प्रतीक निर्माण के लिए पार्सिंग से सीधे।

याद रखें: प्रत्येक .cpp फ़ाइल के लिए आप # शामिल करें, संकलक को उस फ़ाइल को पढ़ना होगा और इसे संकलित करना होगा। भले ही फ़ाइल एक ही चीज है, हर बार यह करता है, फिर भी इसे फ़ाइल को कड़ाई से पढ़ना चाहिए और इसे संसाधित करना होगा। अगर हम एक अवधारणा-आकार std::vector के बारे में बात कर रहे हैं, तो इसे टेम्पलेट की सभी अवधारणा जांच करना होगा। संकलन करते समय आपको अभी भी मानक मानक लुकअप करना है। इत्यादि।

कल्पना करें कि कंपाइलर को ऐसा करने की आवश्यकता नहीं है। कल्पना कीजिए कि क्या यह सीधे डिस्क से प्रतीकों और परिभाषाओं का एक गुच्छा लोड कर सकता है। बिल्कुल संकलित नहीं; उपयोग करने के लिए अन्य कोड के लिए प्रतीकों और परिभाषाओं को ला रहा है।

यह प्रीकंपिल्ड हेडर की तरह ही बेहतर होगा। प्रीकंपिल्ड हेडर केवल एक प्रति .cpp फ़ाइल तक सीमित हैं, जबकि आप जितनी चाहें उतने मॉड्यूल का उपयोग कर सकते हैं।

अफसोस की बात है, मॉड्यूल सी ++ 0x से प्रक्रिया में बहुत जल्दी yanked था। और मॉड्यूल के बिना, अवधारणाओं के साथ मानक पुस्तकालय को बाधित करना हमेशा अनियंत्रित संस्करण की तुलना में अधिक धीरे-धीरे संकलित होगा।

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

+0

+! अवधारणाओं के कारण धीमेपन के स्पष्टीकरण के लिए, लेकिन क्या आपके पास मौजूद अवधारणाओं के दृष्टिकोण का संदर्भ है (जैसा कि एक हर्ब सटर के विपरीत है)? –

+0

@ बेन वोगेट: वह मॉड्यूल था, अवधारणा नहीं। और यह मेरी दृष्टि नहीं है; यह एन 2316 में डेवेड वंदेवोर्डे द्वारा उल्लिखित सबसे हालिया मॉड्यूल पेपर का डिज़ाइन लक्ष्य है। यह यहां एक पीडीएफ के रूप में उपलब्ध है: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/ –

+0

हाँ, मेरा मतलब मॉड्यूल था। एक कार्यकारी समूह संदर्भ बिल्कुल वही है जो मैं उम्मीद कर रहा था। –

0

आपको ConceptsGCC website पर उपयोगी संसाधन मिल सकते हैं। यह संकलक (जीसीसी बंद कर दिया गया है) जिसे वे यह देखने के लिए निर्माण कर रहे थे कि अवधारणा (क्षमादान क्षमा करें) संभव था या नहीं।

मुझे लगता है कि खर्च भाषा संरचनाओं के सभी प्रकारों पर पूरी तरह से और सर्वव्यापी और रिकर्सिव वैधता जांच करने से आता है, और यह देखते हुए कि आप बाधाओं का एक बहुत समृद्ध सेट निर्दिष्ट कर सकते हैं, उन लोगों की जांच करना बहुत महंगा हो सकता है।

अपवाद विनिर्देशों के एक दुःस्वप्न संस्करण की तरह थोड़ा सा!

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