根據LLVM Coding Standards,「LLVM不使用例外」。但是,LLVM確實使用了C++的標準容器,如std::vector
。LLVM如何使用C++的標準容器而沒有例外?
LLVM如何可以無例外地使用標準容器?它如何處理一個容器通常會出現的情況throw
?例如,如果std::vector::push_back
無法分配內存並且不能throw std::bad_alloc
會發生什麼情況?
根據LLVM Coding Standards,「LLVM不使用例外」。但是,LLVM確實使用了C++的標準容器,如std::vector
。LLVM如何使用C++的標準容器而沒有例外?
LLVM如何可以無例外地使用標準容器?它如何處理一個容器通常會出現的情況throw
?例如,如果std::vector::push_back
無法分配內存並且不能throw std::bad_alloc
會發生什麼情況?
LLVM對待達到一個將立即崩潰引發異常的狀態。如果使用的實現/編譯設置啓用異常,則拋出一個並且找不到catch處理程序並調用std::terminate
。如果實現/編譯設置禁用異常,則實現必須提供一些替代行爲。大多數人會立即以這樣或那樣的方式崩潰。
LLVM上的開發人員使用這些設置來測試他們的代碼,並小心避免可能導致的情況。
無法直接避免的一種情況是分配失敗。 LLVM根本不支持分配可能失敗的平臺,用戶必須趕上bad_alloc
。如果平臺無法在任何時候分配內存,LLVM將會崩潰。
事實證明,今天絕大多數非嵌入式平臺都使用某種形式的overcommit。由於LLVM是如何設計的,我們沒有特別有用的機制可以正常響應分配內存失敗。因此,它被認爲是一個致命的和不可恢復的錯誤,並且無論我們是否啓用異常,我們都將在此時終止流程。
libC++實現包含_LIBCPP_NO_EXCEPTIONS
上的檢查,這是從編譯器對異常的支持中推導出來的。
如果我看看向量的具體實現,它看起來像聲明條件而不是拋出異常。但是,我無法驗證bad_alloc
。
由於在給出-fno-exceptions
時沒有關於行爲的文檔,所以我會假定應用程序崩潰。
這個問題似乎在問關於LLVM本身的編碼風格,而不是相同開發人員提供的標準庫的實現。 –
LLVM可以用自己的C++編譯器和自己的STL實現來構建。所以要麼他們應該預先檢查,這對於防止std :: bad_alloc或崩潰是很難/不可能的。 – JVApen
它在報價中說它將它關閉,這是用'-fno-rtti'或-'fno-exceptions'完成的。 –