Zuerst sollten Sie sie wahrscheinlich verwenden, wenn sie Ihnen helfen, Ihr Problem zu lösen. Vorlagen sind ein sehr wichtiger Teil von C ++ und seit Jahren Teil des Standards. STL ist zur Laufzeit sehr leistungsfähig und schnell und sollte auf allen vernünftigen Compilern unterstützt werden, aber natürlich gibt es Probleme.
um nur ein paar zu nennen, aber die Nachteile, sie nicht zu verwenden, sind wahrscheinlich viel größer.
Offensichtliche Nachteile:
Die Syntax kann schrecklich sein - einige Bits der Vorlagensyntax in C ++ überschreiten die Grenzen der Vernunft und überschneiden sich mit anderen Teilen der Sprache (z. B. & gt; & gt;)
Viele Leute verstehen die STL nicht sehr gut, daher können Sie Ihre Zielgruppe einschränken.
Fehlermeldungen sind oft sehr kompliziert.
Das Design der STL-Sammlungen führt dazu, dass viele Objekte kopiert werden. Der ursprüngliche "Smart Pointer" (std :: auto_ptr) war für die meisten Sammlungen nicht geeignet. Die Dinge haben sich in letzter Zeit verbessert (TR1)
Es gibt mehrere mögliche Vor- und Nachteile
Nachdem wir das gesagt haben, verwenden wir C ++ und Templates (und in einigen Bereichen auch Meta-Programmiertechniken) zum Vorteil unserer gesamten Codebasis. Der Code ist etwas größer als ohne Vorlagen, aber die Kompromisse bei Leistung und Wartbarkeit überwiegen die Größe. Wir haben erfahrene C ++ - Programmierer, die an der Entwicklung und Pflege des Codes arbeiten.
Wenn Sie Nachteile verwenden, um zu entscheiden, ob Sie C ++ - Funktionen / Bibliotheken verwenden sollen, stellen Sie sicher, dass Sie die Vorteile sowohl für die Sprache als auch für Ihr Projekt / Produkt / Unternehmen abwägen. Hoffe, das hilft.
Edit: Ein weiterer großer Nachteil, den ich vergessen habe zu erwähnen - Portabilität. Wenn Sie tragbaren Code schreiben müssen, sind Vorlagen möglicherweise nicht der richtige Weg. Die meisten populären Compiler unterstützen heute die STL, aber die meisten sind nicht alle. Die Metaprogrammiertechniken können echte Mörder für die Portabilität sein, also ist dies eine definitive Überlegung, um die Angemessenheit ihrer Verwendung zu bestimmen.
Für Embedded Device Programmierung (in meinem Fall - Smartphones). Es wird davon abgeraten, Vorlagen zu verwenden, da die Größe des generierten Codes (geringe Größe des Arbeitsspeichers und Festplattenspeicher) zu gering ist. Auch die Compiler sind ziemlich alt und können wahrscheinlich nicht mit einigen Template-bezogenen Konstrukten umgehen.
Um Andrej Alexandrescu von Modern C ++ Design Ruhm zu paraphrasieren. Template ist eine orthogonale Struktur zur Mehrfachvererbung . Sie haben beide komplementäre Kompromisse und Vorteile. Vorlagen haben eine reiche Mechanik, aber die Spezialisierung von Vorlagen ist nicht skalierbar.
Schwerer Vorlagenmissbrauch (insbesondere Vorlage Meta-Programmierung und Boost Sucht) kann zu übermäßig führen Lange Kompilier- und Verknüpfungszeiten.
Sie landen auch mit ausführbaren Dateien die haben erheblich größer (nicht entfernte) Binärdateien, aber im Allgemeinen Das ist kein schreckliches Problem.
Schlecht gestaltete Vorlagen können auch Erhöhen Sie die Code-Duplizierung weiter Verschärfung der ausführbaren Dateigröße Problem.
Für Klassenvorlagen mit großen Implementierungen müssen auch beachte die Tatsache, dass mit a Vorlage für sie bedeutet Bewegen der gesamter Klassenkörper in eine Kopfzeile irgendwo. Das ist viel mehr Laden Sie den Linker, wenn die Vorlage wird an mehreren Stellen verwendet.
Fehlermeldungen aus schwer vorlagengestütztem Code können für Uneingeweihte entmutigend sein und sind selten, wenn überhaupt, so klar wie die Fehlermeldungen, die Sie aus untemplatiertem Code erhalten.
Das heißt, für die meisten Anwendungen sind Vorlagen ein wunderbares Werkzeug für die Wiederverwendung von Code und helfen, die Ebene des Diskurses von der Neuimplementierung bis zur Wiederverwendung von Code zu heben. selten übertreffen diese Probleme die Vorteile.
Das Ziel der Vorlage ist die Abstraktion mit minimaler Leistungseinbuße. In den meisten Fällen überwiegen die Vorteile die Nachteile. Die meisten Probleme mit Vorlagen stammen aus der Unterstützung von Compilern und Debuggern.
Mein Haustier ärgert sich über die Vorlage: es vereitelt Smart-Build-System aufgrund von Header-Abhängigkeiten. Das Entwickeln von Vorlagencode führt dazu, dass viel mehr unberührten Code neu kompiliert wird, als ein reines OO-basiertes System zu entwickeln, insbesondere wenn letztere das DIP (Dependency Inversion Principle) gut verwenden. Dies verschlimmert das Problem der langsamen Kompilierung. OTOH, schnellere dev-Hardware macht die Dinge heutzutage viel erträglicher als zuvor.
Sowohl für STL als auch für Boost ist es ihr Ziel, portable und einigermaßen effiziente Datenstrukturen und Algorithmen bereitzustellen. Sie sind nicht die beste Wahl für bestimmte leistungskritische Anwendungen. Beispiel: Obwohl hash_map
( tr1/unordered_map
) für durchschnittliche Fälle relativ gut funktioniert, können spezielle Hashtabellen (z. B. die Google Sparse / Dichte-Hashtabellenbibliothek) generische STL-Implementierungen in Bezug auf Speicherauslastung oder -geschwindigkeit deutlich übertreffen / p>
Es gibt viele (bestenfalls) philosophische Argumente für und gegen C ++ - Vorlagen, aber die, die ich am meisten akzeptiere, ist, dass der Mechanismus, mit dem sie zur Kompilierungszeit instanziiert werden, eine beträchtliche Menge an Code-Bloat erzeugt.
Das ist zwar normalerweise nicht besonders wichtig, aber wenn Sie Code für ein eingebettetes System mit sehr beschränkenden Beschränkungen für die Binärgröße schreiben, wirkt sich dies erheblich aus.
In der MSVC-Implementierung hat std :: string einen Overhead von 26 Bytes PRO STRING, selbst wenn die Zeichenfolge leer ist. Wenn Sie nur char * ausführen würden, wären es 4 Bytes pro String.
Komplexe STL-Container (und in der Tat jede komplexe C ++ - Klasse) machen das Debuggen viel schwieriger.
Neben den zuvor erwähnten nicht lesbaren Fehlermeldungen gibt es in aktuellen Debuggern für die Handhabung von STL-Konstrukten meist wenig Unterstützung. Zum Beispiel ist es viel einfacher, ein natives C-Array zur Laufzeit zu untersuchen, als einen Vektor & lt; & gt; Container.
Hoffentlich wird sich die Situation mit der Zeit ändern. Ansonsten sind Vorlagen wunderbar.
Die Art und Weise, wie Vorlagen instanziiert werden, erfordert, dass Sie sorgfältig darauf achten, wie Sie Ihre Vorlagen deklarieren und definieren, wenn Sie sie über Übersetzungseinheiten hinweg freigeben. Das Buch "C ++ Templates: The Complete Guide" ist eine gute Quelle für Informationen darüber, wie man damit umgeht.
Compiler und Linker Fehlermeldungen für Vorlagen sind in der Regel sehr, sehr ausführlich. Sie werden sich daran gewöhnen müssen, und ich denke, es gibt einige Skripte / Tools, die sie lesbarer machen, aber ich habe keine Erfahrung mit ihnen.
Aber abgesehen davon sind Vorlagen großartig!