2010-07-04 16 views
5

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

क्या यह सच है? राज्यों को लौटने/राज्य का जवाब देने तक चर से भिन्न अपवाद हैं? इस विषय पर स्टैक ओवरफ्लो पढ़ना उस पर विरोधाभास करता है।

आप

उत्तर

11

मैं नहीं जानता कि जहां आप यह पढ़ धन्यवाद, लेकिन यह निश्चित रूप से सही नहीं है। कोई हार्डवेयर डिजाइनर असाधारण परिस्थितियों को नहीं बनायेगा, जो परिभाषा असामान्य हैं, सामान्य से अधिक तेज़ काम करते हैं। यह भी ध्यान रखें कि सी, जो TIOBE के अनुसार सबसे लोकप्रिय सिस्टम भाषा है, अपवादों का भी समर्थन नहीं करता है। ऐसा लगता है कि प्रोसेसर को एक भाषा के अपवाद हैंडलिंग के लिए अनुकूलित किया गया है, जिसका कार्यान्वयन कंपाइलरों के बीच भी मानकीकृत नहीं है।

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

4

नहीं। किसी रजिस्टर में चर को चिपकाने से कुछ भी तेज नहीं होगा। स्पष्ट हार्डवेयर समर्थन के साथ भी, अपवादों को अभी भी मेमोरी एक्सेस जैसी चीजों की आवश्यकता होगी।

सी ++ अपवादों को इस तरह से अधिकांश भाग के लिए लागू नहीं किया जा सका, क्योंकि सी ++ की आवश्यकता है कि ढेर अवांछित हो और वस्तुओं को नष्ट कर दिया जाए।

14

ध्यान रखें कि "अपवाद हैंडलर" शब्द में अस्पष्टता है। मेरा मानना ​​है कि जब अपवाद के बारे में बात आपको लगता है कि हार्डवेयर लोगों मिल जाएगा तरह बातें मतलब है:

  1. हार्डवेयर बीच में आता है, उर्फ ​​संकेत, जिसका संचालकों कभी कभी अपवाद हैंडलर कहलाते हैं
  2. मशीन की जांच अपवाद है, जो रोक (http://pages.cs.wisc.edu/~smoler/x86text/lect.notes/interrupts.html देखें) कंप्यूटर अगर हार्डवेयर में कुछ गलत हो जाता है (http://en.wikipedia.org/wiki/Machine_Check_Exception देखें)

इनमें से किसी के पास सी ++ की अपवाद हैंडलिंग सुविधा के साथ कुछ भी नहीं है।

एक काउंटररेक्स नमूना के रूप में, मेरे पास कम से कम एक अनावश्यक डेटा बिंदु है जहां अपवादों को रिटर्न कोड की तुलना में धीमा तरीका था: यह इंटेल हार्डवेयर पर ठीक था, लेकिन जीसीसी 2.95 और बहुत बड़ी अपवाद तालिका के साथ कोड का एक बहुत बड़ा सेट था, पहली बार एक अपवाद फेंक दिया गया था। बाद के अपवाद तेजी से थे, लेकिन तब तक नुकसान आमतौर पर किया जाता था। माना जाता है कि, जीसीसी 2.95 बहुत प्राचीन है, लेकिन यह इंटेल हार्डवेयर पर भी C++ अपवाद हैंडलिंग की गति के बारे में सामान्यीकरण करने के बारे में आपको सावधानी बरतने के लिए पर्याप्त होना चाहिए।

0

भले ही वे तेज़ थे, आपको असाधारण स्थितियों के अलावा किसी अन्य चीज़ के लिए उनका उपयोग नहीं करना चाहिए। यदि आप उनका दुरुपयोग करते हैं तो आप अपने प्रोग्राम को डीबग करने के लिए बहुत कठिन बनाते हैं। जीडीबी में आप 'कैच फेंक' कर सकते हैं और आसानी से पता लगा सकते हैं कि आपका प्रोग्राम गलत कहां जा रहा है और अपवाद फेंक रहा है, लेकिन यदि आप अपने नियमित प्रसंस्करण के हिस्से के रूप में अपवाद फेंक रहे हैं।

2

जवाब तकनीकी रूप से सही है, लेकिन अत्यधिक गुमराह।

इस मुद्दे के मूल में अवलोकन है कि अपवाद असाधारण हैं। वे आमतौर पर नहीं होते हैं। यह तब नहीं होता जब आप कोई त्रुटि कोड लौटाते हैं। यह हमेशा होता है, भले ही कोई त्रुटि न हो।उस मामले में समारोह अभी भी 0, या true, या -1, या ...

वापस जाने के लिए अब इसका मतलब है कि एक सीपीयू और एक संकलक विशेष रूप से कार्य करता है कि अपवाद से असफल अनुकूलन कर सकते हैं है। लेकिन को का एहसास करना महत्वपूर्ण है, और यह असाधारण मामलों की लागत पर गैर-विफलता, अपवाद-अप केस है।

एक बार हमें एहसास हो जाने के बाद, हम देख सकते हैं कि कंपाइलर और सीपीयू ऐसे मामलों को कैसे अनुकूलित करते हैं। एक सामान्य विधि अपवाद कोड को सामान्य कोड से अलग रख रही है। नतीजतन, वह कोड आमतौर पर सीपीयू कैश में समाप्त नहीं होगा, जिसके परिणामस्वरूप अधिक उपयोगी कोड हो सकता है। वास्तव में, अपवाद कोड रैम में समाप्त नहीं हो सकता है, और डिस्क पर रह सकता है।

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

0

आपका प्रश्न, एक छोटे से स्पष्ट नहीं है तीन बातों को शामिल किया गया:

  • एक try ब्लॉक में प्रवेश कर। यह कोई लागत है, लेकिन एक throw अधिक महंगा बना दिया जाता है कर सकते हैं। a more specific question about this on SO है।
  • एक throw निष्पादित। वहाँ a more specific question about this on SO है।
  • throw से catch पर प्राप्त करने के लिए स्टैक को अनइंड करना, और सीपीयू कैश में त्रुटि हैंडलिंग कोड (catch में) लोड करना। आपका, इस लागत की अनदेखी क्योंकि आप इस लागत का भुगतान करता है, तो अपवाद स्थिति कोड के बजाय का उपयोग कर करना चाहिए करना चाहिए।
संबंधित मुद्दे