Jerry ha detto: ... il risultato non è più abbastanza C ++ , mentre la mia metafora è che è chiaramente C ++, solo un dialetto leggermente diverso perché i programmi utilizzano altre forme, convenzioni e stili scritti.
Ecco i miei motivi principali per disabilitarli:
Compatibilità binaria
Attraversare i confini della lingua e della traduzione non è universalmente ben definito o indefinito. Se si desidera garantire che il programma funzioni nel dominio del comportamento definito, sarà necessario mettere in quarantena le eccezioni nei punti di uscita del modulo.
Dimensione eseguibile
Ecco le dimensioni binarie di un programma senza eccezioni che ho scritto, creato senza e con le eccezioni abilitate:
Senza eccezioni:
- eseguibile + dipendenze: 330
- eseguibile messo a nudo finale (build di rilascio): 37
Con eccezioni:
- eseguibile + dipendenze: 380
- eseguibile messo a nudo finale (build di rilascio): 44
Promemoria: è una raccolta di librerie e programmi che contengono zero tiri / catture. La bandiera compilatore fa consentire eccezioni nella libreria standard C ++. Pertanto, il costo nel mondo reale è più del 19% visto in questo esempio.
Compilatore: apple gcc4.2 + llvm. Dimensioni in MB.
Velocità
Nonostante il termine "eccezioni a costo zero", aggiungono comunque un certo sovraccarico anche quando non viene mai lanciato nulla. Nel caso precedente, si tratta di un programma critico per le prestazioni (elaborazione del segnale, generazione, presentazione, conversioni, con set di dati / segnali di grandi dimensioni, ecc.). Le eccezioni non sono una caratteristica necessaria in questo progetto, mentre le prestazioni sono molto importanti.
Correttezza del programma
Sembra una strana ragione ... Se il lancio non è un'opzione, devi scrivere programmi relativamente severi, corretti e ben testati per garantire che il tuo programma venga eseguito correttamente e che i client utilizzino correttamente le interfacce (se mi dai una cattiva discussione o lo fai non controllare un codice di errore, quindi ti meriti UB). Il risultato? La qualità dell'implementazione migliora notevolmente e i problemi vengono risolti rapidamente.
Semplicità
Le implementazioni di gestione delle eccezioni non sono spesso aggiornate. Aggiungono anche molta complessità perché un'implementazione può avere molte molte molte sequenze di uscita. È più semplice leggere e mantenere programmi molto complessi quando usano un piccolo insieme di strategie di uscita ben definite, tipizzate, che si diffondono e sono gestite dal cliente. In altri casi, le implementazioni potrebbero nel tempo implementare più tiri o le loro dipendenze potrebbero introdurli. I clienti non possono difendersi facilmente o appropriatamente da tutte queste uscite. Scrivo e aggiorno molte librerie, ci sono frequenti evoluzioni e miglioramenti. Tentare di mantenere tutto in sincronia con le sequenze di uscita delle eccezioni (in una base di codice di grandi dimensioni) non sarebbe un buon uso del tempo e probabilmente aggiungerebbe molto rumore e cruft. A causa della maggiore correttezza del programma e di più test,
Storia / Codice esistente
In alcuni casi, non sono mai stati introdotti per motivi storici. Una base di codice esistente non li utilizzava, la modifica dei programmi potrebbe richiedere anni-uomo e rendere veramente brutto il mantenimento a causa della sovrapposizione di convenzioni e implementazioni.
Svantaggi
Naturalmente, ci sono degli aspetti negativi, i più grandi sono: incompatibilità (incl. Binario) con altre librerie e il fatto che dovrai implementare una buona quantità di programmi per adattarsi a questo modello.