कई कारण
हैडर फाइलें
हर एक संकलन इकाई को सैकड़ों (1) लोड करने के लिए हेडर की जरूरत होती है और (2) संकलित की जाती है। उनमें से हर एक को आमतौर पर हर संकलन इकाई के लिए फिर से तैयार करना पड़ता है, क्योंकि प्रीप्रोसेसर यह सुनिश्चित करता है कि हेडर को संकलित करने का परिणाम हर संकलन इकाई के बीच भिन्न हो सकता है। (मैक्रो को एक संकलन इकाई में परिभाषित किया जा सकता है जो हेडर की सामग्री को बदल देता है)।
यह शायद है मुख्य कारण है, क्योंकि यह कोड की भारी मात्रा में हर संकलन इकाई के लिए संकलित की आवश्यकता है, और इसके अलावा, हर हैडर कई बार संकलित की (हर संकलन इकाई है कि यह भी शामिल है के लिए एक बार) है।
लिंक करना
एक बार संकलित करने के बाद, सभी ऑब्जेक्ट फ़ाइलों को एक साथ जोड़ना होगा। यह मूल रूप से एक अखंड प्रक्रिया है जिसे बहुत अच्छी तरह से समानांतर नहीं किया जा सकता है, और इसे आपकी पूरी परियोजना को संसाधित करना होगा।
पदच्छेद
वाक्य-विन्यास बेहद जटिल है, छंद पर निर्भर करता है, संदर्भ पर बहुत अधिक निर्भर करता है, और अवहेलना करने के लिए बहुत कठिन है। इसमें बहुत समय लगता है।
टेम्पलेट्स
C # में, List<T>
केवल एक ही प्रकार है जो संकलित किया जाता है, फिर चाहे आपके कार्यक्रम में आपके पास कितनी भी सूची हो। C ++ में, vector<int>
से एक पूरी तरह से अलग प्रकार है vector<float>
, और प्रत्येक को अलग से संकलित करना होगा।
यह जोड़ें कि टेम्प्लेट एक पूर्ण ट्यूरिंग-पूर्ण "उप-भाषा" बनाते हैं जिसे कंपाइलर को व्याख्या करना पड़ता है, और यह हास्यास्पद रूप से जटिल हो सकता है। यहां तक कि अपेक्षाकृत सरल टेम्पलेट मेटाप्रोग्रामिंग कोड पुनरावर्ती टेम्प्लेट को परिभाषित कर सकता है जो दर्जनों और दर्जनों टेम्प्लेट इंस्टेंटेशन बनाते हैं। टेम्प्लेट में बेहद जटिल प्रकार भी हो सकते हैं, हास्यास्पद रूप से लंबे नामों के साथ, लिंकर में बहुत सारे अतिरिक्त काम जोड़ सकते हैं। (इसमें बहुत सारे प्रतीक नामों की तुलना की गई है, और अगर ये नाम कई हजार वर्णों में विकसित हो सकते हैं, तो यह काफी महंगा हो सकता है)।
और निश्चित रूप से, वे हेडर फ़ाइलों के साथ समस्याओं को बढ़ाते हैं, क्योंकि टेम्पलेट्स को आम तौर पर हेडर में परिभाषित किया जाना है, जिसका अर्थ है कि प्रत्येक संकलन इकाई के लिए कहीं अधिक कोड को पार्स और संकलित किया जाना है। सादे सी कोड में, एक हेडर में आम तौर पर केवल आगे की घोषणाएं शामिल होती हैं, लेकिन बहुत कम वास्तविक कोड। C ++ में, हेडर फ़ाइलों में निवास करने के लिए लगभग सभी कोड के लिए यह असामान्य नहीं है।
अनुकूलन
C ++ कुछ बहुत नाटकीय अनुकूलन के लिए अनुमति देता है। सी # या जावा कक्षाओं को पूरी तरह से समाप्त करने की अनुमति नहीं देता है (उन्हें प्रतिबिंब के प्रयोजनों के लिए होना चाहिए), लेकिन यहां तक कि एक साधारण सी ++ टेम्पलेट मेटाप्रोग्राम आसानी से दर्जनों या सैकड़ों कक्षाएं उत्पन्न कर सकता है, जो सभी के लिए अनुकूलित हैं और अनुकूलन में फिर से समाप्त हो जाते हैं। चरण।
इसके अलावा, सी ++ प्रोग्राम को कंपाइलर द्वारा पूरी तरह से अनुकूलित किया जाना चाहिए। AC # प्रोग्राम JIT कंपाइलर पर लोड-टाइम में अतिरिक्त अनुकूलन करने के लिए भरोसा कर सकता है, C ++ को ऐसा कोई "दूसरा चांस" नहीं मिलता है। कंपाइलर जो उत्पन्न करता है वह उतना ही अनुकूलित होता है जितना कि यह मिलने वाला है।
मशीन
C ++ को मशीन कोड के लिए संकलित किया गया है जो कि bytecode Java या .NET उपयोग की तुलना में कुछ अधिक जटिल हो सकता है (विशेषकर x86 के मामले में)। (यह पूरी तरह से केवल इसलिए उल्लेख किया गया है क्योंकि यह टिप्पणियों और ऐसे में उल्लेख किया गया था। व्यवहार में, यह कदम कुल संकलन समय के एक छोटे से अंश से अधिक लेने की संभावना नहीं है)।
निष्कर्ष
इन कारकों में से अधिकांश सी कोड द्वारा साझा किए जाते हैं, जो वास्तव में काफी कुशलता से संकलित करते हैं। पार्सिंग चरण सी ++ में बहुत अधिक जटिल है, और इसमें काफी अधिक समय लग सकता है, लेकिन मुख्य अपराधी शायद टेम्पलेट है। वे उपयोगी हैं, और C ++ को अधिक शक्तिशाली भाषा बनाते हैं, लेकिन वे संकलन गति के मामले में भी टोल लेते हैं।