2009-09-22 7 views
28

Ad esempio, perché la maggior parte dei membri nell'implementazione STL ha il prefisso _M_ o _ o __? Perché c'è così tanto codice boilerplate?Perché l'implementazione STL è così illeggibile? In che modo C++ avrebbe potuto essere migliorato qui?

Quali sono le carenze di C++ che consentono di rendere l'implementazione del vettore (ad esempio) chiara e più concisa?

+0

A quale implementazione di STL si riferisce? – morechilli

+7

E perché ti preoccupi dei dettagli di implementazione? –

+2

Alcune implementazioni STL vengono deliberatamente scritte per essere concise. Il modo in cui il codice è scritto è qualcosa che non rientra nello scopo dello standard: il fatto che la tua implementazione sia conforme agli standard è tutta l'informazione di cui avresti bisogno nella maggior parte delle circostanze. –

risposta

34

Le implementazioni utilizzano nomi che iniziano con un trattino basso seguito da una lettera maiuscola o due caratteri di sottolineatura per evitare conflitti con macro definite dall'utente. Tali nomi sono riservati in C++. Ad esempio, è possibile definire una macro denominata Type e quindi #include <vector>. Se le implementazioni vector utilizzavano Type come nome di un parametro, si rompono. Tuttavia, non è possibile definire macro chiamate _Type (o __type, type__ ecc.). Pertanto, vector può tranquillamente utilizzare tali nomi.

+0

+1 Infatti. L'implementazione di GCC contiene anche un commento che spiega perché il contenitore sottostante della coda è chiamato c e non è "snellito come da linee guida di stile". – UncleBens

+2

Quindi il C++ avrebbe potuto essere migliorato rendendo il sistema di macros più potente :) –

+2

namespace per macro? – Aardvark

5

Un sacco di implementazioni STL includono anche il controllo di build di debug, come la verifica che due iteratori provengano dallo stesso contenitore durante il confronto e che guardino gli iteratori che escono fuori limite. Ciò comporta un codice abbastanza complesso per tracciare il contenitore e la validità di ogni iteratore creato, ma è inestimabile per trovare bug. Questo codice è anche tutto intrecciato con il codice di rilascio standard con #ifdefs - anche negli algoritmi STL. Quindi non sarà mai chiaro come la loro operazione più basilare. Siti come this one mostrano la funzionalità di base degli algoritmi STL, affermando che la loro funzionalità è "equivalente a" il codice che mostrano. Non lo vedrai comunque nei tuoi file di intestazione.

2

In aggiunta alle buone ragioni che Robson e AshleysBrain hanno già fornito, una ragione per cui le implementazioni di libreria standard C++ hanno nomi così concisi e codice compatto è che praticamente ogni programma C++ (unità di compilazione, in realtà) include un gran numero di standard le intestazioni delle librerie e vengono quindi ricompilate più volte (ricordate che sono in gran parte incorporate e basate su modelli, mentre le intestazioni di libreria C standard contengono solo una manciata di dichiarazioni di funzioni). Una libreria standard scritta secondo le linee guida di stile "standard del settore" richiederebbe più tempo per essere compilata e quindi condurre alla percezione che un particolare compilatore fosse "lento". Riducendo al minimo gli spazi bianchi e utilizzando nomi di identificatori brevi, lesser e parser hanno meno lavoro da fare e l'intero processo di compilazione si conclude un po 'più velocemente.

Un'altra ragione degna di nota è che molte implementazioni di librerie standard (ad esempio Dinkumware, Rogue Wave (vecchio), ecc.) Possono essere utilizzate con diversi compilatori con conformità agli standard e peculiarità ampiamente differenti. Spesso c'è un sacco di hackeraggio macro mirato a soddisfare ogni piattaforma supportata.