2011-01-17 18 views

उत्तर

1

http://www.cplusplus.com/reference/std/new/nothrow/

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

फिर भी, मैं सामान्य रूप से सामान्य रूप से प्राथमिकता प्राप्त करता हूं।

9

जैसा कि मैं इसे समझता हूं, बहुत ज्यादा और कोई नहीं।

9

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

+12

क्या उन्हें 'मॉलोक' के रूप में छोड़ना भी आसान नहीं है? सी ++ में भी, 'मॉलोक' फेंक नहीं देता है। –

+0

@ स्टेव जेसॉप, क्या कोई गारंटी है कि 'मॉलोक' और 'फ्री' एक साथ काम करते हैं? यदि नहीं, तो यह परिवर्तित करने के लिए सबसे आसान हो सकता है ताकि आप सुसंगत हो सकें। –

+3

@ मार्क: सुनिश्चित नहीं है कि आपका क्या मतलब है "एक साथ काम करें"। यदि सी कोड यह सब कुछ मॉलॉक्स को मुक्त नहीं करता है, तो इसे बगफिक्स करना इसे पोर्ट करने से अलग है। यदि सी लाइब्रेरी 'मॉलोक की मेमोरी है और इसे कॉलर को' फ्री 'पर छोड़ देती है, तो सी ++ संस्करण के क्लाइंट इसके बजाय' डिलीट 'करना पसंद कर सकते हैं, लेकिन * इंटरफ़ेस को बदलकर इस तरह से आपको बदलाव करना होगा कोई भी सी ++ कोड जो पहले से ही पुराने सी संस्करण का उपयोग कर रहा था। मुझे लगता है कि मैं इस कारण के बदलाव से सहमत हो सकता हूं, ऐसा कोई मौजूदा सी ++ कोड नहीं मानता। अप्रिय इंटरफ़ेस, हालांकि, C++ संस्करण के लिए इसे बेहतर बनाने के बेहतर तरीके हैं। –

3

मुझे पता है कि सी ++ (विशेष रूप से माइक्रोसॉफ्ट के) के पुराने संस्करण थे, जो तब नहीं फेंकते जब वे स्मृति आवंटित नहीं कर सके, लेकिन इसके बजाय न्यूल लौट आए। यह सभी तर्क बदलने के बजाय पुराने कोड के साथ संगतता बनाए रखने का एक आसान तरीका होगा।

+3

AFAIK यह माइक्रोसॉफ्ट नहीं है, अपवादों को पेश करने से पहले यह पूर्व-मानक सी ++ में नया काम करता है। – ybungalobill

+0

टिज़ेन ओएस मानक अपवाद हैंडलिंग का समर्थन नहीं करता है। वे दो चरण कन्स्ट्रक्टर के साथ नाखून का उपयोग करते हैं। – bikram990

4

शायद यदि आपके एप्लिकेशन को नैनो-अनुकूलन की आवश्यकता है और अपवाद हैंडलिंग के ओवरहेड की अनुमति नहीं दे सका, तो शायद nothrow की आवश्यकता होगी।

ध्यान रखें कि स्ट्रॉस्ट्रप बहुत अशिष्ट है कि प्रोग्रामर सी ++ में ओवरहेड बंद कर सकता है। (हालांकि एक चेतावनी के रूप में, सिर्फ इसलिए कि आपके पास विकल्प का मतलब यह नहीं है कि आपको चाहिए।)

4

जब आप हर नए के बाद शून्य के लिए जांच करना चाहते हैं तो आप std :: nothrow का उपयोग करते हैं। मानक के पहले संस्करण को बनाया गया था जब बहुत सारे विरासत कोड की आवश्यकता थी। इसके बाद लिखे गए बहुत सारे विरासत कोड भी इसका उपयोग करते हैं क्योंकि लोग अपवादों के पागलपन करते हैं। कभी-कभी आप किसी ऐसे व्यक्ति में भाग लेंगे जो अभी भी है।

यह बहुत दुर्लभ है कि आप वास्तव में ऐसा करना चाहते हैं कि मुझे डब्ल्यूटीएफ याद रखने के लिए मुझे एक सेकंड भी लगा।

1

मुझे कल्पना है कि इसे कस्टम आवंटकों के साथ फास्ट-पथ ऑप्टिमाइज़ेशन के रूप में उपयोग किया जा सकता है - कहें, वर्तमान अनुरोध विफल करें और बाद में/निष्क्रिय समय पर पूल बढ़ाएं। बहुत ज्यादा एक कोने का मामला।

11

मैं इसे केवल ऑप्टिमाइज़ेशन (या कोड सरलीकरण) के रूप में उपयोग करता हूं, जब मैं अन्यथा नियमित रूप से नए, std::bad_alloc को पकड़ने के लिए तुरंत कोशिश करता हूं।

यह काफी दुर्लभ स्थिति है, क्योंकि कॉल साइट पर वहां मेमोरी को आसानी से संभालने में सक्षम होना दुर्लभ है। आम तौर पर आप स्मृति आवंटित करते हैं क्योंकि आपको इसकी आवश्यकता होती है, न कि क्योंकि आप इसे पसंद करना चाहते हैं लेकिन बिना रह सकते हैं। कोड जो नल पॉइंटर्स को कॉलर्स की एक श्रृंखला का बैक अप लेता है, अंततः कोई समस्या से निपटने के लिए बेवकूफ सी ++ नहीं है।

ऐसा हो सकता है हालांकि वास्तव में त्रुटि को तुरंत संभाला जा सकता है। उदाहरण के लिए आप ऐसी परिस्थिति में हो सकते हैं जहां आप एक एल्गोरिदम या तकनीक का उपयोग पर्याप्त काम करने वाली जगह, और एक अलग, धीमी एल्गोरिदम या तकनीक के बिना करेंगे। फिर फिर, क्या आप new के साथ सीधे ऐसी कार्यस्थल स्थान आवंटित करेंगे? सामान्य रूप से नहीं। और वैसे भी, आपको कभी-कभी उस दृष्टिकोण से सावधान रहना पड़ता है, क्योंकि यदि आपका ओएस सामान्य रूप से अधिक हो जाता है तो एप्लिकेशन स्तर पर गहराई से स्मृति से संभाल नहीं सकता है।

ध्यान दें कि std :: nothrow अभी भी एक अपवाद फेंक कर सकते हैं शामिल एक अभिव्यक्ति (वस्तु के किसी भी निर्माता से विशेष रूप से आवंटित किया जा रहा), तो यह केवल एक बात आप एक अपवाद फेंकने से बचने के लिए उम्मीद कर रहे हैं अगर जरूरत है। आपको यह भी सुनिश्चित करना होगा कि कन्स्ट्रक्टर फेंक नहीं देगा।

जहां तक ​​मुझे सी ++ प्रोग्राम के दिन चिंतित हैं जो अपवादों का उपयोग नहीं करते हैं, खत्म हो गए हैं। मुझे लगता है कि अगर वे कुछ विशेष स्टाइल गाइड के कारण मेरे लिए फिर से शुरू हो जाते हैं, तो यह नया होने की आवश्यकता के लिए अन्य संभावित कारण है।

+0

इस उत्तर को प्रश्न के साथ क्या करना है? सवाल std :: nothrow के बारे में था और उन तरीकों के बारे में नहीं था जो अपवाद नहीं फेंकते हैं। – kingston

-2

केवल बहुत कम कार्यक्रमों को कभी भी 1 जीबीबी मेमोरी आवंटित करना चाहिए, और चूंकि आधुनिक सिस्टम ओवरकमिट मेमोरी, new कभी भी इन सिस्टम पर शून्य या फेंक नहीं देगा। इसलिए, बिल्कुल नए/मॉलोक के वापसी मूल्य की जांच करने में बिल्कुल कोई बात नहीं है। बस अपनी मेमोरी पदचिह्न को नीचे रखें और आउट-ऑफ-मेमोरी-किलर को अन्य प्रक्रियाओं को शूट करें!

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