[英]C++: Can “try { foo(); } catch (…) { throw; }” be optimized to “foo();”?
在C ++中,是以下代碼
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
不,兩者不相同。
當沒有異常處理程序時堆棧是否展開是實現定義的([except.handle] p9)。 當處理程序在那里,但它只是重新拋出異常時,必須至少解開堆棧,直到重新拋出異常為止。
那是:
struct S { ~S(); };
void foo() { S s; throw 0; }
int main() {
try { foo(); }
catch(...) { throw; }
}
這必須調用s
的析構函數。 當try { ... } catch (...) { throw; }
try { ... } catch (...) { throw; }
被刪除,它不再需要調用s
的析構函數。
它甚至可以,取決於什么s
的析構函數確實,對於執行永遠無法到達異常的重新投擲,加入如:
#include <stdlib.h>
S::~S() { exit(0); }
現在,程序必須成功運行,但是當try { ... } catch (...) { throw; }
try { ... } catch (...) { throw; }
被刪除,這不再是必需的,崩潰可以和它真實系統發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.