Nachteile für Vorlagen und die STL in C ++ [geschlossen]

7

Gibt es Nachteile bei der Verwendung der STL oder Vorlagen? Gibt es Situationen, für die sie nicht geeignet sind?

    
minty 05.11.2008, 20:28
quelle

13 Antworten

15

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.

  • Wenn Sie einen wirklich alten Compiler haben, wird STL möglicherweise nicht vollständig unterstützt.
  • Die Thread-Sicherheit der STL-Implementierung könnte für Ihre Anwendung funktionieren
  • Vorlagen können zu langsameren Kompilierzeiten und möglicherweise größeren ausführbaren Dateien führen, besonders bei älteren Compilern.
  • Compiler erzeugen häufig unbegreifliche Fehlermeldungen im Code mit Vorlagen.

um nur ein paar zu nennen, aber die Nachteile, sie nicht zu verwenden, sind wahrscheinlich viel größer.

    
David Nehme 05.11.2008 20:29
quelle
10

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)

Will Dean 05.11.2008 20:32
quelle
7

Es gibt mehrere mögliche Vor- und Nachteile

  • Vorlagen erweitern die Größe des resultierenden Codes.
  • Vorlagencode wird zur Kompilierzeit erweitert und verarbeitet, wodurch die Kompilierungszeiten länger werden können. (Auf der anderen Seite kann ausführbarer Code effizienter sein).
  • Nicht verwendete STL-Elemente können zu einem langsameren Code
  • führen
  • Die STL macht Code tatsächlich lesbarer (meine Meinung unterscheidet sich von Wills). Wie jede andere Sprache oder Bibliothek muss man es verstehen, um es angemessen zu benutzen ... was ein Nachteil für Leute ist, die es nicht kennen.
  • Wenn Sie Templates im Sinne einer Meta-Programmierung verwenden (nicht mit der STL verwechseln), sieht der Code wie eine Sprache aus, die sich komplett von C ++ unterscheidet. Es kann schwieriger sein zu analysieren, was der Code tatsächlich tut. (OTOH, richtig gemacht - Meta-Programmierung lässt dich auf Architektur und Design konzentrieren; es bringt auch mehr Fehler bei der Kompilierung als bei der Laufzeit. Das ist ein großer Gewinn, wenn du eine kritische Eigenschaft hast und ein falsch codiertes Stück fangen kannst zur Kompilierzeit, anstatt einen Kunden während des Betriebs zu fangen!)

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.

    
twokats 05.11.2008 20:47
quelle
3

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.

    
Kasprzol 05.11.2008 20:55
quelle
2

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.

    
mempko 05.11.2008 21:22
quelle
2
  1. Schwerer Vorlagenmissbrauch (insbesondere Vorlage Meta-Programmierung und Boost Sucht) kann zu übermäßig führen Lange Kompilier- und Verknüpfungszeiten.

  2. Sie landen auch mit ausführbaren Dateien die haben erheblich größer (nicht entfernte) Binärdateien, aber im Allgemeinen Das ist kein schreckliches Problem.

  3. Schlecht gestaltete Vorlagen können auch Erhöhen Sie die Code-Duplizierung weiter Verschärfung der ausführbaren Dateigröße Problem.

  4. 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.

  5. 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.

    
Edward KMETT 05.11.2008 21:43
quelle
1

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>     

ididak 06.11.2008 01:39
quelle
0

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.

    
hark 05.11.2008 20:34
quelle
0

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.

    
Corey Trager 05.11.2008 20:35
quelle
0

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.

    
nimrodm 05.11.2008 20:59
quelle
0

Es könnte sein, dass sie schlecht in andere objektorientierte Sprachen übersetzen, die keine Vorlagen wie C # und Java unterstützen. Wenn Sie also eine Entwicklergruppe aus diesen Sprachen haben, werden Sie mit einer steileren Lernkurve konfrontiert.

    
JohnMcG 05.11.2008 20:45
quelle
0

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!

    
andreas buykx 05.11.2008 20:53
quelle
-6

Lesen Sie den Abschnitt Vorlagen von C ++ FQA [sic] aus vielen guten Gründen, keine Vorlagen zu verwenden.

    
Adam Rosenfield 05.11.2008 21:31
quelle

Tags und Links