2016-10-06 7 views
6

सी ++ में, निम्न कोडसी ++: "कोशिश करें {foo();} पकड़ें (...) {throw;}" अनुकूलित करें "foo();"?

try { 
    foo(); 
} catch (...) { 
    throw; 
} 

शब्दार्थतः पहचान सिर्फ foo इस तरह बुला रहा है?

foo(); 

यदि हां, तो मैं एक राज्य के अत्याधुनिक संकलक दूसरे संस्करण के पहले संस्करण से बचने के लिए उम्मीद कर सकते हैं (जब अनुकूलन के साथ संकलन सक्षम)?

दूसरे शब्दों में, अगर मैं NDEBUG के साथ इस कोड संकलन और अनुकूलन सक्षम

try { 
    foo(); 
} catch (...) { 
    assert(some_check()); 
    throw; 
} 

मैं मान सकते हैं कि यह कभी नहीं धीमी है कि इस बदसूरत संस्करण

#ifndef NDEBUG 
    try { 
#endif 
    foo(); 
#ifndef NDEBUG 
    } catch (...) { 
    assert(some_check()); 
    throw; 
    } 
#endif 
+2

[अभ्यास में नहीं।] (Https://godbolt.org/g/kXdxf6) – Veedrac

+0

मैं केवल अनुमान लगा रहा हूं, लेकिन अगर foo() के अंदर कुछ भी अपवाद फेंकता है, तो यह मानना ​​सुरक्षित है कि संकलक इसे बना सकता है अनुकूलन। – DeiDei

+2

@DeiDei अगर 'foo' फेंक नहीं सकता है (और संकलक यह जानता है, उदाहरण के लिए' nexcept' के माध्यम से), संकलक किसी भी संबंधित अपवाद हैंडलिंग शाखाओं को हटा देगा। लेकिन सवाल उससे अधिक सामान्य है। – Veedrac

उत्तर

3

नहीं, दो हैं होना चाहिए बराबर नहीं है।

अपवाद के लिए कोई हैंडलर नहीं होने पर स्टैक अवांछित है या नहीं ([.handle] p9 को छोड़कर)। जब एक हैंडलर होता है, लेकिन यह केवल अपवाद को फिर से फेंकता है, तो उस बिंदु तक कम से कम अपर्याप्त होना चाहिए जहां अपवाद को फिर से फेंक दिया जाता है।

यही कारण है:

struct S { ~S(); }; 
void foo() { S s; throw 0; } 
int main() { 
    try { foo(); } 
    catch(...) { throw; } 
} 

यह s के नाशक कॉल करना होगा। जब try { ... } catch (...) { throw; } हटा दिया गया है, तो अब s के विनाशक को कॉल करने की आवश्यकता नहीं है।

यह क्या s के नाशक करता अपवाद के फिर से फेंकने तक पहुँचने कभी नहीं करने के लिए कहा जैसे द्वारा निष्पादन के लिए, पर निर्भर करता है, यहां तक ​​कि संभव है:

#include <stdlib.h> 
S::~S() { exit(0); } 

अब, कार्यक्रम को सफलतापूर्वक चलाना चाहिए, लेकिन जब try { ... } catch (...) { throw; } हटा दिया गया है, तो अब इसकी आवश्यकता नहीं है, और वास्तविक सिस्टम पर एक क्रैश हो सकता है और हो सकता है।

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