2016-02-12 19 views
11

Nel libro Più efficace C++ (numero 15), ho letto che il codice diventa molto più lento se le eccezioni sono abilitate, anche se non vengono utilizzate. A mio parere, le eccezioni sono di uso limitato e cerco di evitarle, ma questo è un altro argomento.Come disattivare la gestione delle eccezioni?

non del tutto a capire la sua dichiarazione:

  1. Che cosa significa l'abilitazione/disabilitazione eccezioni significa? È la differenza tra avere zero o più di zero try/catch blocchi? È una bandiera del compilatore? Cosa succede se utilizzo una DLL in cui possono verificarsi eccezioni?
  2. Supponiamo non fa eccezione è mai gettato:
    • funziona il codice di diventare più lento nel suo insieme o sono solo le parti in cui il programma entra/esce cercano blocchi/catch diventano più lenti? Secondo l'autore, entrambi sono vere.
  3. Come posso compilare senza eccezioni? Posso farlo anche se ho provato/catturare i blocchi? Posso farlo se le DLL che uso potrebbero generare eccezioni?
+1

Il libro è vecchio, i compilatori sono diventati un heckofalot più intelligente da allora. Oggi uno discreto può farlo con zero overhead, usando la ricerca basata su tabella dall'indirizzo dell'istruzione per trovare il codice che deve essere eseguito quando lo stack è svolto.Ma se vuoi preoccuparti comunque, guarda le opzioni del compilatore, la maggior parte ha un'opzione per disabilitare la funzione. –

+0

"A mio parere, le eccezioni sono di uso limitato e cerco di evitarle, ma questo è un altro argomento." La mia ipotesi è che il tuo codice non chiami nessuna chiamata di sistema fallibile. Stai programmando un riscaldatore della CPU? –

+0

@ user4590120: le eccezioni non sono l'unico modo per gestire l'errore. Io uso i codici di ritorno per verificare se sono riusciti o meno. – Fabian

risposta

6

Che cosa significa attivazione/disattivazione di eccezioni?

Passare un flag al compilatore che disabilita la conformità standard in relazione alle eccezioni e non genera alcun supporto di eccezione.

Cosa succede se utilizzo una DLL in cui possono verificarsi eccezioni?

Se alcune librerie gestiscono l'eccezione internamente, nulla. Se lascia scappare al chiamante (non ho mai visto nessuna libreria che lo faccia, a causa di problemi ABI, ma qualunque cosa sia), il tuo programma si blocca (nel migliore dei casi) perché non può gestirlo. Se è presente un wrapper per DLL incluso nel codice e che converte i codici di errore in eccezioni (occorrenza comune), allora è lo stesso che si utilizzassero eccezioni nel codice.

Il codice diventa più lento nel suo complesso o solo le parti in cui il programma entra/esce i blocchi try/catch diventano più lenti? Secondo l'autore, entrambi sono vere.

Si noti che il libro che si sta citando è vecchio. I compilatori si stanno evolvendo. I compilatori moderni utilizzano eccezioni a costo zero che non incidono sul costo della perfomance se non viene generata un'eccezione. La gestione delle eccezioni rende più grande l'eseguibile in quanto dovrebbe generare tutti i dati e il codice necessari per elaborare le eccezioni, ma non dovrebbe renderlo più lento su un percorso non eccezionale.

Come posso compilare senza eccezioni? Posso farlo anche se ho provato/catturare i blocchi?

Lo si fa in modo specifico del compilatore. Consulta la documentazione del compilatore. In genere, ciò fa sì che il codice di rifiuto del compilatore contenga qualsiasi struttura relativa alle eccezioni, ad es. indicare try come identificatore non riconosciuto.

+1

"La gestione delle eccezioni rende più grande l'eseguibile" - più grande di cosa? il programma equivalente con i valori di ritorno degli errori richiede anche codice e dati per gestirli. Il grande vantaggio delle eccezioni è che l'errore di gestione del codice e dei dati può essere lasciato inizialmente sul disco, quindi il tuo programma inizia più velocemente. – MSalters

+0

"non dovrebbe renderlo più lento su un percorso non eccezionale" - in effetti, la moderna gestione delle eccezioni rende il percorso non-error _faster_. Questo perché il compilatore può identificare e ottimizzare quel percorso. Con i valori di ritorno dell'errore, il compilatore non sa se ottimizzare il valore di ritorno '== 0' o'! = 0', poiché le diverse funzioni utilizzano convenzioni di valore di ritorno diverse. – MSalters

+1

@MSalters rispetto allo stesso codice esatto compilato senza supporto di eccezione (questo significa che il codice originale deve essere senza alcuna gestione delle eccezioni). Questo elimina la gestione delle eccezioni per la libreria standard ('new' di solito si trasforma in nothrow' new', sostituendo l'eccezione 'bad_alloc' con crash del puntatore nullo successivamente, ad esempio) –