2010-03-05 17 views
9

के बारे में बुनियादी प्रश्न आज प्रोजेग पढ़ने के दौरान, मैं इस टिप्पणी पर post में आया था कि Google एई चुनौती में शीर्ष स्थानों को सी ++ द्वारा कैसे लिया गया था। उपयोगकर्ता reventlov वाणीआरएआईआई, एसटीएल पॉप, और पीआईएमपीएल

सबसे बड़ी समस्या मैं सी के साथ ++ है कि यह लगता है कि तुम सच में सब बातें आप सी ++ स्वीकार्य अच्छी तरह से उपयोग करने के लिए समझने की जरूरत को समझे बिना कर रहे हैं एक "सी ++ प्रोग्रामर" waaay भी आसान है।

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

मुझे लगता है कि मैं उन अनजान सी ++ प्रोग्रामर में से एक हूं जिसका उल्लेख है। इस संक्षिप्त को रखने के लिए, मेरे प्रश्न

  1. क्या आप एक सामान्य RAII निरीक्षण गलती का उदाहरण दे सकते हैं, उदा। जहां सर्वोत्तम अभ्यास आरएआईआई के उपयोग को निर्देशित करते हैं लेकिन प्रोग्रामर ने किसी अन्य तरीके से उपयोग किया है?
  2. क्यों एसटीएल में पॉप() विधियों को वे मूल्य वापस नहीं लौटाते हैं?
  3. मैंने पीआईएमपीएल के लिए विकिपीडिया प्रविष्टि पढ़ी, इसे किसी भी समझ में नहीं आया। क्या आप पीआईएमपीएल मुहावरे के एक सामान्य उपयोग का उदाहरण दे सकते हैं।
+0

मुझे प्रश्न 1 नहीं समझा, क्या आप इसे फिर से लिख सकते हैं? –

+21

शायद आप reddit पर खुश रहेंगे? यहां एक नियम एक समय में एक प्रश्न है। –

+2

@Neil, lol यह आपकी अगली 10+ टिप्पणी बनने जा रहा है xD –

उत्तर

9
  1. एक अच्छा उदाहरण जहां आरएआईआई महत्वपूर्ण है लेकिन कभी-कभी भूल जाता है जब एक म्यूटक्स लॉक करता है। यदि आपके पास कोड का एक अनुभाग है जो म्यूटेक्स को लॉक करता है, तो ऑपरेशंस करता है, फिर इसे अनलॉक करता है, यदि ऑपरेशन अपवाद फेंकता है या अन्यथा थ्रेड मर जाता है, तो म्यूटेक्स लॉक रहता है। यही कारण है कि कई स्कोप्ड लॉक क्लासेस (जैसे QMutexLocker) हैं क्योंकि here कहा गया है, आप गारंटी देते हैं कि विनाशक भाग जाएगा। तो यदि आप एक स्कोप्ड लॉक का उपयोग करते हैं तो यह हमेशा मृत लॉक को रोकने के विनाश पर अनलॉक करेगा।

  2. पॉप void गति के लिए लौटाता है, और ऑब्जेक्ट कॉपी कन्स्ट्रक्टर द्वारा फेंकने वाले अपवादों को रोकने के लिए।

  3. PIMPL बाइनरी संगतता प्रदान करने के लिए क्यूटी ढांचे द्वारा भारी रूप से उपयोग किया जाता है। यह आपको सार्वजनिक एपीआई से डेटा संरचना के सभी आंतरिक छिपाने की अनुमति देता है। इसका अर्थ यह है कि, यदि आप कक्षा में निजी सदस्यों को जोड़ना चाहते हैं, तो आप इसे डी-पॉइंटर में जोड़ दें। यह Binary Code Compatibility बनाए रखता है क्योंकि केवल एकमात्र डेटा सदस्य एक सूचक है।

+2

+1: एसटीआई डिजाइन करने में एसजीआई का निर्णय अपवाद-सुरक्षा, लेकिन दक्षता के संदर्भ में समझाया नहीं गया था। बेशक यह नहीं दिखाता है कि सी ++ मानकीकरण प्रक्रिया ने एक ही तर्क को बनाए रखा है, या एक ही निष्कर्ष पर एक और तरीके से आया है। –

3

हर्ब सटर के "असाधारण सी ++" और "असाधारण सी ++ शैली" पढ़ें।

+0

मैं बस इतना कहने वाला था। "असाधारण सी ++" इन तीन विषयों (और दूसरों) को बहुत अच्छी तरह से कवर करता है। –

9

मैं बिंदु 2 का उत्तर दूंगा, और बाकी के लिए बाकी को छोड़ दूंगा। मुख्य कारण pop हटाया गया मूल्य वापस नहीं करता अपवाद सुरक्षा के कारण है।

सबसे पहले, समझें कि सी ++ कंटेनर (विपरीत, कहें, जावा के हैं) मूल्य द्वारा अपनी ऑब्जेक्ट्स रखें। इसका अर्थ यह है कि यदि आप कंटेनर को पॉपिंग समय पर ऑब्जेक्ट वापस करने के लिए चाहते हैं, तो उसे ऑब्जेक्ट को हटाए जाने की प्रतिलिपि बनाकर, उस वस्तु को मूल्य से वापस कर देना होगा। इसके विपरीत, से पहले top तक पहुंचने से, यह केवल शीर्ष तत्व का संदर्भ वापस कर सकता है, और आप इसे पॉप करने से पहले इसे अपने दिल की सामग्री में कॉपी कर सकते हैं। (जबकि, अगर pop संदर्भ द्वारा तत्व लौट आए, यह एक झूलने संदर्भ, के रूप में वस्तु नहीं रह गया है कंटेनर में होगी।)

नकल में शामिल अक्षमता से मूल्य (एक तरफ से pop में वापसी के परिणाम वस्तु को हटाया जा रहा है) यह है कि यह अपवाद सुरक्षा को खतरे में डाल देता है। आदर्श रूप से, यदि कोई ऑपरेशन अपवाद फेंकता है, तो शामिल वस्तुओं की स्थिति अपरिवर्तित है। लेकिन अगर pop हटाए गए ऑब्जेक्ट को मूल्य से वापस करना था, तो क्या होगा यदि उस ऑब्जेक्ट के लिए कॉपी कन्स्ट्रक्टर विफल हुआ? ऑब्जेक्ट को कंटेनर से पहले ही हटा दिया जाएगा, और इस प्रकार राज्य पहले ही बदल चुका है।

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

+2

यह स्पष्ट नहीं करता है कि मानक म्यूचुअल में अन्य म्यूटेटर फ़ंक्शन गैर-बिल्टिन प्रकारों को मूल्य के आधार पर क्यों लौटाता है (स्वीकार्य रूप से आमतौर पर इटरेटर, जिनके निर्माता * फेंकने में सक्षम होने की संभावना नहीं है)। लेकिन हां, तथ्य यह है कि वे एक मजबूत अपवाद गारंटी प्रदान नहीं करते हैं इसका मतलब यह नहीं है कि शीर्ष/पॉप नहीं होना चाहिए। –

+0

'टेम्पलेट टाइपनाम सी :: value_type पॉप (सी और सी) {typename सी :: value_type copy = c.top(); c.pop(); वापसी की प्रति; } 'एकमात्र अपवाद सुरक्षा समस्या यह है कि यदि आइटम का डॉटर फेंक सकता है, लेकिन डाटर फेंकना * बेहद दुर्लभ होना चाहिए, और गैर-फेंकने वाले डाटर को आसानी से अन्य पॉपर आवश्यकताओं के समान इस पॉप() को कॉल करने की आवश्यकता हो सकती है। –

+0

@ रोगर: यह ठीक है, लेकिन (अपवाद सुरक्षा पर) कंप्यूटर्स को आरवीओ को लागू करने की आवश्यकता नहीं है, इस मामले में, 'रिटर्न कॉपी' प्रतिलिपि बनाने वाले को फिर से कॉल करने का कारण बनती है। (पीएस फेंकने वाले डॉटर्स बहुत खराब समाचार (टीएम) हैं, क्योंकि यदि यह स्टैक अनचाहे के दौरान होता है, तो 'std :: terminate' को लागू किया जाता है, या उस प्रभाव के लिए कुछ। इसलिए कोई सुरक्षित रूप से यह मान सकता है कि ऐसा नहीं होना चाहिए।) –

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