- ऐसे कार्यों के कई उदाहरण हैं जिन्हें मैं जानता हूं कि वे कभी नहीं फेंकेंगे, लेकिन जिसके लिए कंपाइलर अपने दम पर इसे निर्धारित नहीं कर सकता है। क्या मुझे ऐसे सभी मामलों में फ़ंक्शन की घोषणा के लिए noexcept संलग्न करना चाहिए?
noexcept
मुश्किल है, क्योंकि यह फ़ंक्शन इंटरफ़ेस का हिस्सा है। खासकर, यदि आप एक पुस्तकालय लिख रहे हैं, तो आपका ग्राहक कोड इस पर निर्भर कर सकता हैnoexcept
संपत्ति है। बाद में इसे बदलना मुश्किल हो सकता है, क्योंकि आप मौजूदा कोड को तोड़ सकते हैं। यह चिंता का विषय हो सकता है जब आप कोड लागू कर रहे हैं जो केवल आपके आवेदन द्वारा उपयोग किया जाता है।
यदि आपके पास एक फ़ंक्शन है जो फेंक नहीं सकता है, तो अपने आप से पूछें कि क्या यह रहना पसंद करेगा noexcept
या क्या भविष्य के कार्यान्वयन को प्रतिबंधित करेगा? उदाहरण के लिए, आप अपवादों (जैसे, इकाई परीक्षणों के लिए) को फेंककर अवैध तर्कों की त्रुटि जाँच शुरू कर सकते हैं, या आप अन्य पुस्तकालय कोड पर निर्भर हो सकते हैं जो इसके अपवाद विनिर्देश को बदल सकते हैं। उस मामले में, यह रूढ़िवादी और ओटिटिक होने के लिए सुरक्षित हैnoexcept
।
दूसरी ओर, यदि आप आश्वस्त हैं कि फ़ंक्शन को कभी नहीं फेंकना चाहिए और यह सही है कि यह विनिर्देश का हिस्सा है, तो आपको इसे घोषित करना चाहिए noexcept
। हालांकि, यह ध्यान रखें कि कंपाइलर noexcept
आपके कार्यान्वयन में बदलाव के उल्लंघन का पता लगाने में सक्षम नहीं होगा ।
- किन स्थितियों में मुझे noexcept के उपयोग के बारे में अधिक सावधान रहना चाहिए, और किन स्थितियों के लिए मैं निहित noexcept (झूठे) के साथ दूर हो सकता हूं?
कार्यों के चार वर्ग हैं जिन पर आपको ध्यान केंद्रित करना चाहिए क्योंकि वे संभवतः सबसे बड़ा प्रभाव डालेंगे:
- चालन चालें (चालन संचालक और चाल निर्माणकर्ता)
- स्वैप ऑपरेशन
- मेमोरी डीललॉकर (ऑपरेटर हटाएं, ऑपरेटर हटाएं]]
- विध्वंसक (हालांकि ये स्पष्ट रूप से
noexcept(true)
तब तक हैं जब तक आप उन्हें नहीं बनाते noexcept(false)
)
ये कार्य आम तौर पर होने चाहिए noexcept
, और यह सबसे अधिक संभावना है कि पुस्तकालय कार्यान्वयन noexcept
संपत्ति का उपयोग कर सकते हैं। उदाहरण के लिए,std::vector
मजबूत अपवाद की गारंटी के बिना गैर-फेंकने वाले चालन संचालन का उपयोग कर सकते हैं। अन्यथा, इसे कॉपी करने वाले तत्वों पर वापस गिरना होगा (जैसा कि C ++ 98 में हुआ था)।
इस तरह का अनुकूलन एल्गोरिथम स्तर पर है और संकलक अनुकूलन पर निर्भर नहीं करता है। यह एक महत्वपूर्ण प्रभाव डाल सकता है, खासकर यदि तत्व कॉपी करने के लिए महंगे हैं।
- जब मैं noexcept का उपयोग करने के बाद प्रदर्शन में सुधार के लिए वास्तविक रूप से उम्मीद कर सकता हूं? विशेष रूप से, कोड का एक उदाहरण दें, जिसके लिए C ++ कंपाइलर noexcept के अलावा बेहतर मशीन कोड उत्पन्न करने में सक्षम है।
noexcept
कोई अपवाद विनिर्देश के खिलाफ लाभ या throw()
यह है कि मानक कंपाइलरों को अधिक स्वतंत्रता की अनुमति देता है जब यह अनडिंडिंग स्टैक करने की बात आती है। में भीthrow()
मामले में, कंपाइलर को स्टैक को पूरी तरह से खोलना होगा (और इसे ऑब्जेक्ट कंस्ट्रक्शन के सटीक रिवर्स ऑर्डर में करना होगा)।
में noexcept
मामला है, दूसरे हाथ पर, यह है कि ऐसा करने के लिए आवश्यक नहीं है। इसमें कोई आवश्यकता नहीं है कि स्टैक को अनवाउंड करना है (लेकिन कंपाइलर को अभी भी इसे करने की अनुमति है)। यह स्वतंत्रता आगे कोड अनुकूलन की अनुमति देती है क्योंकि यह हमेशा ढेर को कम करने में सक्षम होने के उपरि को कम करती है।
Noexcept, stack unwinding और प्रदर्शन के बारे में संबंधित प्रश्न ओवरहेड के बारे में अधिक जानकारी में जाता है जब स्टैक अनइंडिंग की आवश्यकता होती है।
मैं स्कॉट मेयर्स की पुस्तक "प्रभावी मॉडर्न सी ++", "आइटम 14: डिक्लेयर फ़ंक्शंस नोएक्ससेप्ट की सलाह देता हूं अगर वे आगे पढ़ने के लिए अपवाद नहीं होंगे"।
move_if_nothrow
(या whatchamacallit) एक प्रदर्शन सुधार देखेंगे अगर वहाँ एक noexcept चाल ctor है।