Jerry powiedział: ... wynik nie jest już całkowicie C ++ , podczas gdy moja metafora jest taka, że jest to oczywiście C ++, tylko nieco inny dialekt, ponieważ programy wykorzystują inne formy, konwencje i style pisane.
Oto moje główne powody wyłączenia:
Kompatybilność binarna
Przekraczanie granic języka i tłumaczeń nie jest powszechnie dobrze zdefiniowane ani niezdefiniowane. Jeśli chcesz zagwarantować, że Twój program działa w domenie określonego zachowania, musisz poddać kwarantannie wyjątki w punktach wyjścia modułu.
Rozmiar pliku wykonywalnego
Oto binarne rozmiary programu bez wyjątków, który napisałem, zbudowałem bez włączonych wyjątków:
Bez wyjątków:
- pliki wykonywalne + zależności: 330
- końcowy plik wykonywalny pozbawiony (kompilacja wydania): 37
Z wyjątkami:
- pliki wykonywalne + zależności: 380
- końcowy plik wykonywalny pozbawiony (kompilacja wydania): 44
Przypomnienie: jest to zbiór bibliotek i programów, które zawierają zerowe rzuty / połowy. Flaga kompilator robi umożliwić wyjątków w C ++ biblioteki standardowej. Dlatego koszt w prawdziwym świecie jest większy niż 19% w tym przykładzie.
Kompilator: apple gcc4.2 + llvm. Rozmiary w MB.
Prędkość
Pomimo terminu „wyjątki zerowego kosztu” wciąż dodają pewne koszty ogólne, nawet jeśli nic się nie rzuca. W powyższym przypadku jest to program krytyczny pod względem wydajności (przetwarzanie sygnałów, generowanie, prezentacja, konwersje, z dużymi zestawami danych / sygnałami itp.). Wyjątki nie są konieczną funkcją w tym projekcie, a wydajność jest bardzo ważna.
Poprawność programu
Wydaje się to dziwnym powodem ... Jeśli rzucanie nie jest opcją, musisz napisać stosunkowo surowe, poprawne, dobrze przetestowane programy, aby zagwarantować, że Twój program działa poprawnie, a klienci poprawnie używają interfejsów (jeśli podasz mi zły argument lub zrobisz to nie sprawdzaj kodu błędu, to zasługujesz na UB). Wynik? Jakość wdrożenia znacznie się poprawia, a problemy szybko się naprawiają.
Prostota
Implementacje obsługi wyjątków nie są często aktualizowane. Dodają również dużo złożoności, ponieważ implementacja może mieć wiele wiele sekwencji wyjścia. Łatwiej jest czytać i obsługiwać bardzo złożone programy, gdy używają niewielkiego zestawu dobrze zdefiniowanych, wpisywanych strategii wyjścia, które pojawiają się i są obsługiwane przez klienta. W innych przypadkach implementacje mogą z czasem wprowadzić więcej rzutów lub ich zależności mogą je wprowadzić. Klienci nie mogą łatwo ani odpowiednio bronić się przed wszystkimi tymi wyjściami. Piszę i aktualizuję wiele bibliotek, często ewoluuję i ulepszamy. Próba utrzymywania tego w synchronizacji z wyjątkowymi sekwencjami wyjściowymi (w dużej bazie kodu) nie byłaby dobrym wykorzystaniem czasu i prawdopodobnie spowodowałaby dużo hałasu i kłopotów. Ze względu na zwiększoną poprawność programu i więcej testów,
Historia / istniejący kod
W niektórych przypadkach nigdy nie zostały wprowadzone z powodów historycznych. Istniejąca baza kodów nie korzystała z nich, zmiana programów mogła zająć wiele lat i uczynić je naprawdę brzydkimi z powodu nakładania się konwencji i implementacji.
Wady
Oczywiście są wady, największe to: Niezgodność (w tym binarna) z innymi bibliotekami oraz fakt, że będziesz musiał zaimplementować dużą liczbę programów, aby pasowały do tego modelu.