2016-07-30 22 views
1

根據LLVM Coding Standards,「LLVM不使用例外」。但是,LLVM確實使用了C++的標準容器,如std::vectorLLVM如何使用C++的標準容器而沒有例外?

LLVM如何可以無例外地使用標準容器?它如何處理一個容器通常會出現的情況throw?例如,如果std::vector::push_back無法分配內存並且不能throw std::bad_alloc會發生什麼情況?

+0

它在報價中說它將它關閉,這是用'-fno-rtti'或-'fno-exceptions'完成的。 –

回答

5

LLVM對待達到一個將立即崩潰引發異常的狀態。如果使用的實現/編譯設置啓用異常,則拋出一個並且找不到catch處理程序並調用std::terminate。如果實現/編譯設置禁用異常,則實現必須提供一些替代行爲。大多數人會立即以這樣或那樣的方式崩潰。

LLVM上的開發人員使用這些設置來測試他們的代碼,並小心避免可能導致的情況。

無法直接避免的一種情況是分配失敗。 LLVM根本不支持分配可能失敗的平臺,用戶必須趕上bad_alloc。如果平臺無法在任何時候分配內存,LLVM將會崩潰。

事實證明,今天絕大多數非嵌入式平臺都使用某種形式的overcommit。由於LLVM是如何設計的,我們沒有特別有用的機制可以正常響應分配內存失敗。因此,它被認爲是一個致命的和不可恢復的錯誤,並且無論我們是否啓用異常,我們都將在此時終止流程。

1

libC++實現包含_LIBCPP_NO_EXCEPTIONS上的檢查,這是從編譯器對異常的支持中推導出來的。

如果我看看向量的具體實現,它看起來像聲明條件而不是拋出異常。但是,我無法驗證bad_alloc

由於在給出-fno-exceptions時沒有關於行爲的文檔,所以我會假定應用程序崩潰。

+0

這個問題似乎在問關於LLVM本身的編碼風格,而不是相同開發人員提供的標準庫的實現。 –

+0

LLVM可以用自己的C++編譯器和自己的STL實現來構建。所以要麼他們應該預先檢查,這對於防止std :: bad_alloc或崩潰是很難/不可能的。 – JVApen