簡體   English   中英

C ++:可以“試試{foo(); } catch(...){throw; “被優化為”foo();“?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM