2016-09-03 13 views
9

हम शायद 'लकड़ी के रास्ते पर' हैं क्योंकि हम जर्मन कहते हैं। (गलत तरीके से जाने के लिए Proverb)सी ++ में मानक पुस्तकालय कार्यान्वयन के बीच क्या अंतर है?

सी ++ मानक पुस्तकालय को परिभाषित करता है और यह मानक सी ++ 98, सी ++ 11, सी + 17 में अक्सर अपडेट हो जाता है (अगर मैं गलत हूं तो मुझे सही करें)। मुझे लगता है कि प्रत्येक कंपाइलर या ओएस इस मानक पुस्तकालय के अपने कार्यान्वयन को परिभाषित करता है।

तो स्पष्ट ओएस विशिष्ट भागों के अलावा, मानक पुस्तकालय के इन कार्यान्वयन के बीच मतभेद (यदि कोई हैं) क्या हैं?

क्या एक ही ओएस के कार्यान्वयन के 'वेरिएंट' हैं? और यदि ऐसा है तो मैं परेशान करना चाहता हूं कि किस कार्यान्वयन का उपयोग किया जाता है?

+0

मुझे लगता है कि 14 में 11 के लिए एक छोटा सा विस्तार था, हालांकि मुझे दावा नहीं करना चाहिए कि मुझे इसके बारे में बहुत कुछ पता है। – mathreadler

उत्तर

6

असल में प्रत्येक कंटेनर की कोई परिभाषा कार्यान्वयन विशिष्ट है। मानक केवल घोषणा और अपेक्षित व्यवहार, साइड इफेक्ट्स और शर्तों को निर्देशित करता है। §21.4.2 से

उदाहरण:

basic_string(const basic_string& str, 
       size_type pos, size_type n = npos, 
       const Allocator& a = Allocator()); 

आवश्यक है: pos <= str.size()

फेंकता: out_of_range अगर pos > str.size()

ई एफएफ ECTS: वर्ग basic_string का एक उद्देश्य निर्माणों और के रूप में टेबल 65.

आप देख सकते हैं में संकेत दिया, n और str.size() - pos के छोटे रूप में प्रारंभिक स्ट्रिंग मान के ई एफएफ ective लंबाई rlen निर्धारित करता है, मानक भी कहते हैं std::basic_string का कन्स्ट्रक्टर करता है, यह नहीं कहता है कि इसे कार्यान्वित किया जाना चाहिए। यह उस हस्ताक्षर को भी परिभाषित करता है जिसका उपयोग किया जाना चाहिए।वास्तविक कार्यान्वयन कंपाइलर विक्रेताओं में भिन्न होता है - gcc और clang में विभिन्न कार्यान्वयन हैं, हालांकि वे एक ही मंच के लिए हैं, लेकिन कन्स्ट्रक्टर एक ही काम करता है। के रूप में वे सभी (चाहिए) में दर्ज सब कुछ करते हैं, -

आप कार्यान्वयन के बारे में चिंता करने की जरूरत नहीं है (कुछ कार्यान्वयन सब कुछ को लागू नहीं करते हैं, लेकिन यह दुर्लभ है ठीक है, तकनीकी रूप से, आप करते हैं) मानक।

+1

यदि आप प्रदर्शन पर विचार करते हैं तो नट-किरकिरा कार्यान्वयन विवरण * बहुत * महत्वपूर्ण हैं। यदि आप केवल फ़ंक्शन पर विचार करते हैं तो इतना नहीं। –

4

ठीक है, मानक शब्द का एक निश्चित अर्थ है, है ना।

बिंदु यह है: यदि चीजें मानक हैं, तो प्रत्येक कार्यान्वयन को उस मानक को प्रतिबिंबित करने की आवश्यकता होती है।

दूसरे शब्दों में: मानकों के बारे में चिंता न करें, लेकिन उन चीजों के बारे में जो बिल्कुल निर्दिष्ट नहीं हैं, उदाहरण के लिए here

इसके अलावा, यह एक बहुत व्यापक विषय है। मुझे लगता है कि आपको संकीर्ण यह अधिक विशिष्ट प्रश्न/क्षेत्रों में नीचे होना चाहिए।

संपादित करें - कारण विभिन्न समूहों को अपने स्वयं के क्रियान्वयन:

  1. उदाहरण के लिए जावा के विपरीत, वहाँ "स्वर्ण मानक" कार्यान्वयन नहीं है
  2. संकलक बिल्डरों को फ़ाइन ट्यून पुस्तकालयों के लिए चाहते हो सकता है उनके उत्पाद (और यह सिर्फ कानूनी/लाइसेंसिंग विषयों के बारे में हो सकता है)
+2

लेकिन 'डंकमवेयर सी ++ मानक लाइब्रेरी', 'अपाचे सी ++ मानक लाइब्रेरी' या 'जीएनयू सी ++ लाइब्रेरी' जैसी चीजें हैं। तो उन्होंने सभी ने अभी सोचा: 'अरे यह बहुत ही बढ़िया है, सभी एक ही चीज़ को लागू करने दें।' या वे सभी अलग ऑपरेटिंग सिस्टम के लिए ment हैं? – FirefoxMetzger

+3

@FirefoxMetzger, स्टार्टर्स के लिए, इसके कुछ हिस्सों को कंपाइलर-विशिष्ट कोड की आवश्यकता होती है। – chris

+1

@FirefoxMetzger मानक एक विशिष्ट कंटेनर या फ़ंक्शन को कार्यान्वित करने का निर्देश नहीं देता है, केवल यह आवश्यक है कि उस वर्ग/विधि का * अर्थशास्त्र * सभी प्रणालियों में सुसंगत रहे। कुछ मामलों में यह मानक द्वारा सख्ती से सेट किया गया है और दूसरों में यह नहीं है, उत्तरार्द्ध का एक उदाहरण होगा ['std :: vector :: shrink_to_fit'] (http://en.cppreference.com/w/cpp/ कंटेनर/वेक्टर/shrink_to_fit) जहां विधि कुछ भी करती है या नहीं पूरी तरह कार्यान्वयन-निर्भर है - यह एक * गैर बाध्यकारी अनुरोध * है। – ArchbishopOfBanterbury

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