सी ++ में, निम्न कोडसी ++: "कोशिश करें {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
[अभ्यास में नहीं।] (Https://godbolt.org/g/kXdxf6) – Veedrac
मैं केवल अनुमान लगा रहा हूं, लेकिन अगर foo() के अंदर कुछ भी अपवाद फेंकता है, तो यह मानना सुरक्षित है कि संकलक इसे बना सकता है अनुकूलन। – DeiDei
@DeiDei अगर 'foo' फेंक नहीं सकता है (और संकलक यह जानता है, उदाहरण के लिए' nexcept' के माध्यम से), संकलक किसी भी संबंधित अपवाद हैंडलिंग शाखाओं को हटा देगा। लेकिन सवाल उससे अधिक सामान्य है। – Veedrac