2010-11-02 3 views
25

llvm/clang sono considerate buone basi di codice C++. Mi chiedo perché le eccezioni C++ non siano mai state usate in loro?Non si usano eccezioni C++ per progettazione, in llvm/clang

La memoria viene gestita utilizzando qualcosa come pool, e gli errori vengono riportati con valori restituiti e codici come in C. Hanno persino l'incarico di nuovo operatore per essere un nuovo posizionamento che restituisce un errore e non un'eccezione quando non c'è memoria.

Hai idea del perché la filosofia di llvm non usi le eccezioni C++ quando la maggior parte dei libri consiglia di utilizzarle?

+1

Verificare la domanda [Perché non utilizzare le eccezioni come flusso di controllo regolare?] (Http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control). Potrebbe essere utile. –

+0

Che cosa ha a che fare RAII con le eccezioni? – codymanix

+5

@ Kirill: quanto è rilevante? Non chiedo di usare le eccezioni come controllo del flusso, ma le uso per quello che intendevano: errate – zaharpopov

risposta

18

Chris Lattner recentemente chiarito la questione nel progetto LLVM coding standards.

Non si utilizzano eccezioni e RTTI riduce le dimensioni dell'eseguibile e riduce il sovraccarico. (Si potrebbe obiettare che le eccezioni a costo zero non hanno un sovraccarico a meno che non siano lanciate. Almeno esse suddividono il codice in blocchi di base più piccoli e inibiscono alcuni tipi di movimento del codice.)

0

La maggior parte dei libri consiglia di utilizzarli? So che la maggior parte dei libri sulla programmazione C++ li copre perché fanno parte del linguaggio, ma non penso di aver visto un libro che diceva di preferirli a codici di errore o altri metodi di gestione degli errori. In effetti direi che la maggior parte dei libri non consiglia di utilizzare eccezioni perché non trattano come scrivere codice di buona eccezione.

Per quanto LLVM sia un buon codice e non sia un codice basato su eccezioni, i due concetti sono in gran parte ortogonali. Il codice può essere scritto in modo pulito con o senza eccezioni.

+4

più efficace C++ consiglia di preferire le eccezioni rispetto ai codici di ritorno c-like perché le eccezioni non possono essere ignorate – zaharpopov

+3

Leggere "Il linguaggio di programmazione C++" –

+9

È vero che la maggior parte dei libri C++ non copre la sicurezza delle eccezioni. È anche vero che la maggior parte dei libri C++ non vale la pena leggerli. I pochi che vale la pena di leggere _do_ coprono le eccezioni di sicurezza, perché è di fondamentale importanza quando si scrive codice C++ corretto. –

0

Sembra che non sia una filosofia di llvm evitare le eccezioni. Almeno non ho trovato nulla sulle eccezioni nello standard di codifica (http://llvm.org/docs/CodingStandards.html), quindi spetta allo sviluppatore.

Perché non è ampiamente utilizzato? Il supporto delle eccezioni AFAIK è stato implementato in llvm non così lontano, quindi non è stato possibile compilare llvm per llvm stesso :). Quindi può essere solo una ragione storica per evitare le eccezioni.

+1

filosofia o no non ci sono assolutamente eccezioni utilizzate in LLVM per quanto ho visto – zaharpopov

+1

forse semplicemente non vogliono? :) Puoi chiedere alla mailing list di llvm – Yuras

6

Scrittura di eccezioni codice C++ sicuro è un compito difficile.

Spegnimento delle eccezioni speed up code execution and reduce code size.

Forse questo è relativo.

+10

Scrivere un codice C++ corretto che non sia anche eccezionalmente sicuro è molto più difficile della semplice scrittura di codice eccezionalmente sicuro (almeno la sicurezza di base delle eccezioni). –

+2

Non riesco a individuare alcun collegamento specifico, ma non usare eccezioni C++ è abbastanza comune. La guida di stile di Google C++ menziona anche che le eccezioni non vengono utilizzate. Forse sono un po 'pessimista, ma la sicurezza delle eccezioni di base potrebbe presto diventare insufficiente quando si tratta di eccezioni. Non come se fossi un sostenitore a favore o contro le eccezioni però ... – rotoglup

+12

@rotoglup: è vero che la guida di stile di Google C++ proibisce le eccezioni, ma spiega anche che non pensavano che fosse più una buona decisione, solo qualcosa a cui sono stati costretti dalla necessità di interagire liberamente con il proprio codice legacy. –

2

penso che questo deriva da un'altra linea guida: Use assert liberally

  • condizioni di errore normali vengono trattati con i codici di errore.
  • Le condizioni di errore eccezionali vengono gestite tramite assert.

direi che un assert è un'eccezione ancora più difficile: non puoi assolutamente ignorarlo;)

+2

nella modalità di rilascio è possibile :) – zaharpopov

+0

@zaharpopov: sì, ma significa che il software ha superato tutti i test e llvm/clang ha una suite di test impressionante in crescita ogni giorno (e testata anche giornalmente: p) –

5

A seconda del compilatore e del codice, un programma che utilizza le eccezioni può essere più veloce o più lento di un programma equivalente che disabilita e non utilizza eccezioni. Anche quello che utilizza le eccezioni potrebbe essere più grande o più piccolo.

Ogni strategia di gestione degli errori incorre in un costo, e mi aspetto che gli sviluppatori di LLVM considerino la loro situazione e abbiano scoperto che disabilitare le eccezioni è stata la decisione migliore per LLVM.

La mia raccomandazione, e la raccomandazione che ho più visto dagli esperti, è quella di utilizzare eccezioni per segnalare i guasti a meno che non si abbia una ragione specifica e solida per non farlo. Se la tua ragione è la performance, sarebbe saggio basare la tua scelta sulla profilazione. Ricordare che è fondamentale confrontare il codice che utilizza le eccezioni al codice che non lo fa, ma gestisce ancora correttamente gli errori.

+5

I libri che ho leggere su stile C++ tutti sostengono errori di segnalazione con eccezioni. Questo include libri scritti da Herb Sutter, Andrei Alexandrescu e Bjarne Stroustrup. La libreria standard consiglia implicitamente eccezioni, in virtù del loro utilizzo per segnalare errori. Semplicemente, le eccezioni sono i metodi standard stabiliti per segnalare gli errori (sebbene altri mezzi siano perfettamente appropriati per alcuni contesti). –