खैर, चलिए सबसे पहले आपकी कुछ मान्यताओं को ध्वस्त करते हैं:
- C ++ के हेडर-ओनली लाइब्रेरी के फायदों में से एक यह है कि उन्हें अलग से संकलित करने की आवश्यकता नहीं है।
अलग-अलग चीजों को संकलित करने का मतलब है कि संभवतः केवल एक भाग में परिवर्तन होने पर सब कुछ फिर से इकट्ठा न करना।
तो, एक लाभ के बजाय एक नुकसान।
- C और C ++ इनलाइन केवल तभी समझ में आता है जब फ़ंक्शन को हेडर फ़ाइल में परिभाषित किया गया है *।
हां, एकमात्र प्रभाव inline
बचा है जो एक-परिभाषा-नियम का अपवाद है ।
यद्यपि आप को पता है कि वे परिभाषाएँ किसी भी तरह से अलग हैं।
इसलिए, यदि कोई फ़ंक्शन किसी संकलन-इकाई में आंतरिक है, तो इसे चिह्नित करें static
। इससे इनलाइनिंग की संभावना भी बढ़ जाती है, क्योंकि इसे इनलाइन करने के लिए फंक्शन की जरूरत होती है।
फिर भी, लिंक-टाइम-ऑप्टिमाइज़ेशन पर एक नज़र डालें, जैसा कि कम से कम MSVC ++, gcc और clang द्वारा समर्थित है।
- परंपरागत रूप से, C में .c / .h लेआउट का उपयोग किया गया है, जहां हेडर अनुवाद इकाई के न्यूनतम सार्वजनिक इंटरफ़ेस का प्रतिनिधित्व करता है। इसी तरह .cpp / hpp।
खैर, केवल न्यूनतम इंटरफ़ेस प्रस्तुत करना निश्चित रूप से लक्ष्यों में से एक है, उच्च एपीआई और एबीआई स्थिरता प्राप्त करने के लिए, और संकलन समय को कम करने के लिए।
विशेष रूप से C ++ क्लासेस वास्तव में इस बात के लिए तैयार नहीं हैं, कि जैसा कि सभी निजी बिट्स हेडर में लीक होते हैं, जैसा कि संरक्षित लोग करते हैं कि आप इसे प्राप्त करना चाहते हैं या नहीं।
डिज़ाइन-पैटर्न PIMPL ऐसे विवरणों को कम करने के लिए है।
वह भाग जहां इंटरफ़ेस को अलग करना और कार्यान्वयन पूरी तरह से C ++ में विफल रहता है, हालांकि टेम्प्लेट हैं।
समिति ने निर्यात किए गए टेम्पलेट्स के साथ कुछ करने की कोशिश की , लेकिन इसे बहुत जटिल माना गया है और वास्तव में काम नहीं कर रहा है।
अब, वे एक उचित मॉड्यूल सिस्टम पर काम कर रहे हैं , हालांकि यह धीमी गति से चल रहा है। यह गंभीर रूप से संकलन-समय को कम करता है, और इसकी सतह को कम करके एपीआई और एबीआई स्थिरता को भी बढ़ाना चाहिए।
क्या हेडर-ओनली लाइब्रेरियां आमतौर पर पारंपरिक लेआउट की तुलना में अधिक कुशल कोड- और निष्पादन समय वार होती हैं? यदि हां, तो क्या यह व्यापक इनलाइनिंग या अन्य अनुकूलन के कारण है?
हेडर-ओनली लाइब्रेरी कोड-आकार और निष्पादन-समय में अधिक कुशल हो सकते हैं, हालांकि यह इस बात पर निर्भर करता है कि लाइब्रेरी साझा की जाती है, इसका कितना उपयोग किया जाता है, किन तरीकों से किया जाता है, और क्या इनलाइनिंग उस विशिष्ट मामले में निर्णायक जीत साबित होती है।
और कारण inlining अनुकूलन के लिए बहुत महत्वपूर्ण है क्योंकि inlining ही इतना बड़ा बढ़ावा है, लेकिन निरंतर-प्रसार और आगे अनुकूलन के अवसरों के कारण यह खुलता है।