Джеррі сказав: ... результат не зовсім C ++ більше , в той час як моя метафора є те , що вона є явно C ++, просто трохи інший діалект , так як програми використовують інші форми, угода і письмові стилі.
Ось мої основні причини відключення:
Бінарна сумісність
Перетинання меж мови та перекладу не є загальновизначеним або визначеним. Якщо ви хочете гарантувати, що програма працює в межах визначеної поведінки, вам потрібно буде зробити карантинний виняток у точках виходу модуля.
Виконаний розмір
Ось бінарні розміри безкоштовної програми для винятку, яку я написав, створеної без та з урахуванням винятків:
Без винятку:
- виконуваний + залежності: 330
- остаточний знятий виконуваний файл (збірка версії): 37
За винятком:
- виконуваний + залежності: 380
- остаточний знімається виконуваний файл (версія версії): 44
Нагадування: Це колекція бібліотек та програм, що містять нульові кидки / вилучення. Прапор компілятора робить включити виключення в стандартній бібліотеці C ++. Тому вартість в реальному світі становить більше 19%, що бачиться на цьому прикладі.
Укладач: яблуко gcc4.2 + llvm. Розміри в МБ.
Швидкість
Незважаючи на термін "виключення з нульовою вартістю", вони все ще додають накладні витрати, навіть коли ніколи нічого не кидає. У вищенаведеному випадку це критична для продуктивності програма (обробка сигналів, генерація, презентація, перетворення, з великими наборами даних / сигналами тощо). Винятки не є необхідною особливістю в цій конструкції, тоді як продуктивність дуже важлива.
Правильність програми
Це здається дивним причин ... Якщо кидання не є варіантом, ви повинні написати відносно суворі, правильні, добре перевірені програми, щоб гарантувати, що програма працює правильно, і щоб клієнти правильно використовували інтерфейси (якщо ви даєте мені поганий аргумент чи ви робите це не перевіряйте код помилки, тоді ви заслуговуєте на UB). Результат? Якість впровадження значно покращується, а проблеми швидко виправляються.
Простота
Реалізації з обробкою винятків часто не оновлюються. Вони також додають великої складності, оскільки реалізація може мати безліч багатьох безлічі вихідних послідовностей. Простіше читати та підтримувати дуже складні програми, коли вони використовують невеликий набір чітко визначених, типізованих стратегій виходу, які підключаються до клієнта та керуються ними. В інших випадках реалізації можуть з часом реалізувати більше кидків або їх залежності можуть ввести їх. Клієнти не можуть легко або належним чином захиститися від усіх цих виходів. Я пишу та оновлюю багато бібліотек, спостерігається часта еволюція та вдосконалення. Спроба зберегти, що все синхронізується з послідовностями виходу виключень (у великій кодовій базі), не буде корисним часом, і, швидше за все, додасть багато шуму та суворості. Через підвищену правильність програми та більше тестів,
Історія / існуючий код
У деяких випадках вони ніколи не були представлені з історичних причин. Існуюча база коду не використовувала їх, зміна програм може зайняти людино-роки і зробити це справді некрасивим, оскільки вони перекриваються конвенціями та реалізаціями.
Недоліки
Звичайно, є і недоліки, найбільші - це незмінність (включаючи двійкові) з іншими бібліотеками, і той факт, що вам доведеться реалізувати хорошу кількість програм, щоб відповідати цій моделі.