該賞金過期5天。此問題的答案有資格獲得 500聲望獎勵。 David542想引起對這個問題的更多關注。
我希望編譯一些 C 代碼,這些代碼大量使用例外到 wasm 目標中。不幸的是,大多數瀏覽器都沒有打開 Webassembly 例外處理(我相信只有 Chrome 在 flag 后面支持它chrome://flags#enable-webassembly),并且在 emscripten 將例外包裝到 javascript 中的方式上存在巨大的性能損失try/catch。我們注意到,當標志打開或關閉時,性能會提高 2 倍。
我相信對此的簡短回答是“否”,但我想知道是否有已知的方法將 C 代碼與例外轉換為 C 代碼,這些代碼根本不使用例外(甚至不在父包裝器中)而無需手動翻譯它。
uj5u.com熱心網友回復:
我認為瀏覽器中的例外會隨著時間的推移而優化。我還認為例外必須(RFC 2119)不能用于計算的基礎,而只能用于不應該(RFC 2119)發生的事件。
顯然“應該”是相對的并且因人而異(專案到專案),但是磁盤錯誤顯然是不應該發生的事件(除非,在您的程式使用損壞的磁盤的情況下,并且磁盤錯誤是正常事件)。當性能成為問題時,更改代碼似乎是最好的解決方案。
自動翻譯聽起來更好,但是當我想到標準變化的頻率 11、17、20 時……我不認為這樣的翻譯系統會跟上,因為它的用例不會那么多(個人意見),首先可能不值得開發它。
無論如何,一個快速的解決方案是將每個匯出的函式包裝在一個新的易于捕獲的函式中,該函式捕獲例外并將它們轉換為回傳值(或將此資訊存盤到執行緒區域變數中),與正常回傳值區分開來,如果任何。這樣至少例外不會傳播到 JS 端。
uj5u.com熱心網友回復:
例外與回傳值的唯一共同點是它是一種錯誤處理形式,從代碼角度來看,它們完全是兩種不同的東西。
除非您可以禁用任何現有的基礎架構,例如#define BOOST_NO_EXCEPTIONS在 Boost 中禁用例外,并使用編譯器標志禁用例外支持-fno-exceptions (這也會使 std 幾乎無法使用) ..唯一的方法是手動編輯......但是,它是可以回傳一個錯誤物件,或者拋出它,這樣可以更容易地逐步引入回傳值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/339642.html
上一篇:AppBar中的搜索功能導致例外
