सवाल pop_back () वापसी मूल्य?


क्यों नहीं pop_back() वापसी मूल्य है? मैंने इसके बारे में गुगल किया है और पाया है कि यह इसे और अधिक कुशल बनाता है। क्या यह मानक में ऐसा करने का एकमात्र कारण है?


44
2017-09-26 11:06


मूल




जवाब:


मुझे लगता है कि इस तथ्य से संबंधित कुछ है कि अंतिम वस्तु का उदाहरण कॉपी करने से अपवाद फेंक सकता है। ऐसा करने पर, आप अपनी ऑब्जेक्ट खो रहे हैं, क्योंकि pop_back () ने इसे आपके कंटेनर से हटा दिया है। कोड की कुछ पंक्तियों के साथ बेहतर:

std::vector<AnyClass> holds = {...} ;
try {
  const AnyClass result = holds.pop_back(); // The copy Ctor throw here!
} catch (...)
{ 
 // Last value lost here. 
}

50
2017-09-26 11:12



+1 T container<T>::pop()अपवाद सुरक्षित लागू नहीं किया जा सकता है (gotw.ca/gotw/008.htm) - hansmaad
+1 यह सही जवाब है। यह हमें अंतर्निहित सिद्धांत बताता है जिसने इस डिजाइन को जन्म दिया pop_back कोई वापसी मूल्य के साथ। - Nawaz
सही। मैं वास्तव में (अभी तक) c ++ 11 के साथ जानकार नहीं हूँ। लेकिन मुझे लगता है कि जवाब अभी भी सच है। मेरा मतलब है, एक कंपाइलर द्वारा प्रदत्त चाल ctor के साथ नहीं, लेकिन एक उपयोगकर्ता परिभाषित एक। इसके अलावा, afaik, मुझे कहीं पढ़ना याद है कि किसी वर्ग को किसी भी चाल ctor (= हटाएं?) Eludes करने के लिए परिभाषित किया जा सकता है। यदि ऐसा है, तो हम प्रतिलिपि ctor मामले में वापस आते हैं (यदि ऐसा प्रदान किया जाता है, अन्यथा मुझे लगता है कि एक वेक्टर का उपयोग संकलन नहीं करेगा)। - yves Baumes
@DeadMG चाल रचनाकार शायद नहीं हो सकता है noexcept या तो, अगर मैं गलत नहीं हूँ - sehe
@DeadMG: चाल या प्रतिलिपि, यह पर निर्भर करता है प्रकार मूल्य के रूप में, हर प्रकार चलने योग्य नहीं है, प्लस चाल अपवाद भी फेंक सकता है। - Nawaz


दक्षता के साथ ऐसा करने के लिए कम (या कुछ भी नहीं, वास्तव में) है।

यह डिजाइन का नतीजा है टॉम कारगिल द्वारा एक महत्वपूर्ण पेपर, 90 के दशक में प्रकाशित, जिसने फिर कुछ भौहें उठाईं। आईआईआरसी, इसमें कारगिल ने दिखाया कि एक अपवाद सुरक्षित स्टैक पॉप फ़ंक्शन डिज़ाइन करना असंभव है।


54
2017-09-26 11:16



टॉम कारगिल पेपर के संदर्भ के लिए +1 "उत्तेजना हैंडलिंग: सुरक्षा की झूठी भावना"। एक अवश्य पढ़ने की बात। :-) - yves Baumes
अगर मुझे सही ढंग से याद है तो "सी ++ भाषा" या "प्रभावी सी ++" के कुछ संस्करणों ने वास्तव में दावा किया है कि यह दक्षता कारणों से था क्योंकि उन्हें तब निर्माण निर्माण और एनआरवीओ नहीं पता था। - Konrad Rudolph
@ कोनराड: एएफएआईआर, मेयर्स ने कारगिल के पेपर पर भी इशारा किया। (इसके बारे में सोचने के लिए आओ, मैं शर्त लगाता हूं कि वास्तविक कारण यह है कि इसकी एक प्रतिलिपि पियरसन की वेबसाइट पर क्यों मौजूद है।) - sbi
हम कैसे सुनिश्चित कर सकते हैं कि हटाई गई वस्तु विनाशक में नहीं फेंकती है? मैं समझता हूं कि यह नहीं होना चाहिए, लेकिन हम इसे कैसे नियंत्रित कर सकते हैं? - Mikhail
@ मिखाइल: अगर विनाशक फेंकते हैं, तो आप कुछ भी गारंटी नहीं दे सकते। यही कारण है कि उन्हें नहीं करना चाहिए। फिर: विनाशकों को कभी फेंकना नहीं चाहिए। अवधि। यदि आप एक डिटोर लिखते हैं जो अपवाद से बचने देता है, तो आप भी उतना ही खराब हो सकते हैं NULL। - sbi


यह की वजह से है कमांड-क्वेरी अलगाव सिद्धांत


13
2017-09-26 11:13





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

अपवादों के बारे में हर्ब सटर किताबों में आप अधिक जानकारी प्राप्त कर सकते हैं। मुझे लगता है कि यह विषय ढंका हुआ है यहाँ। किंतु मुझे यकीन नहीं है।


6
2017-09-26 11:14



समस्या यह नहीं है कि कंटेनर बदल गया है, समस्या यह है कि वस्तु को हटाया जा सकता है, लेकिन आप इसे वापस नहीं मिला है - तो यह खो गया है। - sbi


कारण अपवाद सुरक्षा के रूप में इतना दक्षता नहीं है। किसी भी प्रकार की वस्तुओं को स्टोर करने के लिए कंटेनर क्लास का उपयोग किया जा सकता है। पॉप अपबैक () को एक अपवाद सुरक्षित तरीके से कार्यान्वित करना असंभव होगा यदि फ़ंक्शन कंटेनर से इसे हटाने के बाद ऑब्जेक्ट वापस कर देगा, क्योंकि ऑब्जेक्ट के मान को वापस करने से कॉपी निर्माण शामिल है।

यह जीएनयू सी ++ मानक पुस्तकालय में वेक्टर :: pop_back () का वास्तविक कार्यान्वयन है:

  void
  pop_back()
  {
    --this->_M_impl._M_finish;
    this->_M_impl.destroy(this->_M_impl._M_finish);
  }

ऐसा लगता है कि यह अंत में अंतिम तत्व को वापस करना चाहिए:

  value_type
  pop_back()
  {
    value_type save = back();
    --this->_M_impl._M_finish;
    this->_M_impl.destroy(this->_M_impl._M_finish);
    return save;
  }

इसमें दो प्रति निर्माण शामिल हैं save = back() कथन और वस्तु की एक प्रति वापस लौटने पर। इस बात की कोई गारंटी नहीं है कि तत्व अभिव्यक्ति से तत्व नष्ट होने के बाद वापसी अभिव्यक्ति अपवाद नहीं फेंक देगी।


4
2017-09-26 11:17





खैर, कितने कारण होने चाहिए?

यह ऑब्जेक्ट की संभावित रूप से महंगा प्रतिलिपि से बचाता है जब आप इसे कंटेनर से हटाना चाहते हैं। सी ++ में आपके लिए आवश्यकतानुसार भुगतान न करने का दर्शन है।


2
2017-09-26 11:11



मेरा मानना ​​है कि यह गलत है। देख रविंद्र के जवाब पर मेरी टिप्पणी। - sbi
क्षमा करें, मुझे क्या गलत नहीं मिला? - Zdeslav Vojkovic
अच्छा, मुझे पूरा यकीन है कि अपवाद से संबंधित समस्या समान है एक कारणों से, लेकिन मुझे भी यकीन है कि यह एक और है। मुझे अभी तक कोई सबूत नहीं दिख रहा है कि इस डिज़ाइन के पास प्रदर्शन समस्या से कोई लेना देना नहीं है (जैसे चलने वाले अर्थशास्त्र एक नई बात है) और मैंने दावा नहीं किया है कि कोई दूसरा नहीं है (ठीक है, मेरी पहली वाक्य इस तरह लग सकती है, लेकिन यह स्पष्ट करने के लिए था कि एक कारण पर्याप्त क्यों नहीं होगा)। "अपवाद सी ++" में सटर का दावा है कि "यहां है एक ऐसा करने का कारण: यह कमजोर अपवाद सुरक्षा से बचाता है। " - Zdeslav Vojkovic
"मुझे अभी तक कोई सबूत नहीं दिख रहा है कि इस डिजाइन के प्रदर्शन के मुद्दे से कोई लेना देना नहीं है।" आपको अभी तक कोई सबूत नहीं दिख रहा है कि इस डिजाइन के केले के साथ कुछ लेना देना नहीं है। इसलिए? यह आप हैं जिन्होंने दावा किया ("यह प्रदर्शन के बारे में है!"), और यह वह है जिसने इसे चुनौती दी। तो यह आप हैं जो दावा का समर्थन करने की जरूरत है। - sbi
ठीक है, तुमने मुझे वहां काम किया है :) Stroustrup 'सी ++ कार्यक्रम में कहते हैं। लैंग '[16.3.5]: It just pops, and if we want to know what was on the top of the stack before pop, we must look. This happens not to be my favorite style of stack, but it's arguably more efficient and it's the standard। ओटीओएच, जोसुटिस पुस्तक कारगिल पेपर को भी संदर्भित करती है। मेरा निष्कर्ष यह प्रदर्शन है है कारणों में से एक, जबकि मैं दावा नहीं करता कि यह एकमात्र है। हालांकि, सभी संदर्भों को पढ़ने पर मैं यह भी सहमत होगा कि इस तरह से निर्णय लेने में अपवाद-सुरक्षा अधिक महत्वपूर्ण कारक हो सकती है। - Zdeslav Vojkovic


यह मूल्य क्यों वापस करेगा? आप इसे पॉप-अप करने से पहले किसी भी समय मूल्य तक हमेशा पहुंच सकते हैं- इसकी कोई आवश्यकता नहीं है pop_back इस कार्यक्षमता प्रदान करने के लिए।


-1
2017-09-26 11:11



-1। यह सवाल का जवाब नहीं देता है। एक तर्क क्यों है pop_back मूल्य वापस नहीं करता है, और यह पोस्ट उस तर्क के बारे में बात नहीं करता है। - Nawaz
तथ्य यह है कि अस्तित्व में रहने का कोई कारण नहीं है, यह अस्तित्व में नहीं है, और यह सवाल का जवाब देता है। - Puppy
@DeadMG: मुझे विश्वास है कि एक अच्छा उपयोगिता मामला समर्थक है pop_back() एक मूल्य लौट रहा है। परंपरागत रूप से, यह एक स्टैक का पॉप फ़ंक्शन करता है। नहीं, कारण अपवाद सुरक्षा के लिए पूरी तरह से कारण है। - sbi