Gute Idee / schlechte Idee. Sollte ich den größten Teil von C++ neu implementieren?[geschlossen]

StackOverflow https://stackoverflow.com/questions/637986

Frage

Kürzlich kam mir nach der Lektüre eine gefährliche Idee in den Sinn Das Blogeintrag.Diese Idee kann folgendermaßen ausgedrückt werden:

Ich benötige das meiste, was die C++-Standardbibliothek bietet, nicht.Warum implementieren ich also nicht eine weniger allgemeine, aber einfacher zu verwendende Version?

Beispielsweise spuckt die Verwendung der STL Unmengen unverständlicher und verstümmelter Compilerfehler aus.Aber Allokatoren, Iteratoren und dergleichen interessieren mich nicht.Warum nehme ich mir also nicht ein paar Stunden Zeit und implementieren beispielsweise eine einfach zu verwendende Klasse für verknüpfte Listen?

Was ich von der StackOverflow-Community gerne wissen würde, ist Folgendes:Was sind die Gefahren, möglichen Nachteile und möglichen Vorteile beim „Rolling my own“ für die meisten vorhandenen Funktionen in C++?

Bearbeiten: Ich habe das Gefühl, dass mich die Leute bezüglich dieser Idee missverstanden haben.Die Idee war zu verstehen, ob ich a umsetzen könnte sehr kleiner Satz STL-Funktionalität, der stark vereinfacht ist – eher als Projekt, um mir etwas über Datenstrukturen und dergleichen beizubringen.Ich schlage nicht vor, das ganze Rad von Grund auf neu zu erfinden, sondern nur den Teil, den ich brauche und über den ich lernen möchte. Ich glaube, ich wollte herausfinden, ob die Komplexität der Verwendung der STL die Erstellung einer kleineren, einfacheren Version von sich selbst rechtfertigt.

Wiederverwendung von Boost oder Ähnlichem.

Das meiste, was ich programmiere, ist für die Universität bestimmt und wir dürfen keine externen Bibliotheken nutzen.Es handelt sich also entweder um die C++-Standardbibliothek oder um meine eigenen Klassen.

Objektivität dieser Frage.

Diese Frage ist nicht subjektiv.Es sollte auch kein Community-Wiki sein, da es sich nicht um eine Umfrage handelt.Ich möchte konkrete Argumente, die einen möglichen Vorteil oder einen Nachteil hervorheben möglicherweise treten bei meinem Ansatz auf.Entgegen der landläufigen Meinung ist dies keine Meinung, sondern basiert auf Erfahrung oder guten logischen Argumenten.

Format.

Bitte posten Sie nur einen Nachteil oder ein Vorteil pro Antwort.Dies ermöglicht es den Leuten, einzelne Ideen zu bewerten, anstatt alle Ihre Ideen auf einmal.

Und bitte...

Keine Religionskriege.Ich bin kein Fan irgendeiner Sprache.Ich verwende alles, was anwendbar ist.Für Grafiken und Datenkomprimierung (woran ich gerade arbeite) scheint das C++ zu sein.Bitte schränken Sie Ihre Antworten auf die Frage ein, sonst werden sie herabgestuft.

War es hilfreich?

Lösung

  

Also, warum ich nicht implementieren eine weniger   Generell aber einfache Version zu benutzen?

Da kann man nicht. Denn was sonst könnte man etwa C ++ sagen, es ist keine einfache Sprache, und wenn man es nicht schon sehr gut ist, wird Ihre verknüpfte Liste Implementierung fehlerhaft sein.

Ehrlich gesagt, Ihre Wahl ist einfach:

Erfahren Sie C ++, oder verwenden Sie es nicht. Ja, C ++ wird allgemein für Grafiken verwendet, aber Java hat auch OpenGL-Bibliotheken. Das Gleiche gilt für C #, Python und praktisch jede andere Sprache. Oder C. Sie müssen nicht C ++ verwenden.

Aber wenn Sie es verwenden, es lernen und es richtig verwenden.

Wenn Sie unveränderlichen Strings wollen, erstellen Sie Ihre Zeichenfolge als konst.

Und unabhängig von der zugrunde liegenden Implementierung ist die STL bemerkenswert einfach zu bedienen.

C ++ Compiler-Fehler können zu lesen, aber es dauert ein bisschen Übung. Aber noch wichtiger ist, sie sind zu AWL-Code nicht exklusiv. Sie werden ihnen begegnen, egal was Sie tun, und welche Bibliotheken Sie verwenden. So gewöhnen sie. Und wenn Sie trotzdem sie gewöhnen, dann kann man auch STL verwenden.

Abgesehen davon, dass ein paar andere Nachteile:

  • Niemand wird verstehen Ihren Code. Wenn Sie eine Frage auf SO über std :: vector fragen, oder bidirektionale Iteratoren, jeder, der einigermaßen vertraut mit c ++ ist zu beantworten. Wenn Sie stoßen Mein :: CustomLinkedList fragen, kann niemand Ihnen helfen. Welches ist bedauerlich, denn auch bedeutet, dass Ihre eigenen rollen, dass es mehr Fehler werden über um Hilfe zu bitten.
  • Sie versuchen, das Symptom zu heilen, und nicht die Ursache. Das Problem ist, dass Sie nicht C ++ verstehen. STL ist nur ein Symptom dafür. STL zu vermeiden wird nicht auf magische Weise Ihre C ++ Code Arbeit besser machen.
  • Der Compiler-Fehler. Ja, sie sind böse zu lesen, aber sie sind da. Eine Menge Arbeit in der STL ist gegangen in diesen falschen Gebrauch gewährleistet werden Compiler-Fehler in den meisten Fällen auslösen. In C ++ ist es sehr einfach Code zu machen, die kompiliert, aber nicht funktioniert. Oder scheint zu funktionieren. Oder funktioniert auf meinem Computer, aber auf mysteriöse Weise an anderer Stelle versagt. Ihre eigene verknüpfte Liste würde mit ziemlicher Sicherheit mehr Fehler bewegen zu Laufzeit, wo sie für eine Weile unentdeckt bleiben würden, und viel schwerer aufzuspüren.
  • Und wieder wird es fehlerhaft sein. Vertrauen Sie mir. Ich habe verdammt gut C ++ gesehen Programmierer eine verkettete Liste in C ++ schreiben nur Fehler nach Fehler, in obskuren Grenzfälle aufzudecken. Und C ++ ist alle Grenzfälle. Wird verknüpften Liste Griff Ausnahme Sicherheit richtig? Wird es garantieren, dass alles in einem konsistenten Zustand befindet, wenn Sie einen neuen Knoten zu schaffen (und damit den Aufruf des Konstrukteurs-Objekttyp) löst eine Ausnahme? Dass es Speicher nicht undicht wird, dass alle entsprechenden Destruktoren aufgerufen werden? Wird es als typsicher sein? Wird es so performant sein? Es gibt eine Menge Kopfschmerzen zu behandeln, wenn das Schreiben Container-Klassen in C ++.
  • Sie verpassten eines der leistungsfähigsten und flexibelsten Bibliotheken existieren, in jeder Sprache. Die STL kann eine Menge tun, dass ein Schmerz auch mit Java Riesen aufgebläht Klassenbibliothek sein würde. C ++ ist schwer genug, bereits, keine Notwendigkeit, die wenigen Vorteile wegzuwerfen es bietet.
  

Ich kümmere mich nicht um Verteilern,   Iteratoren und dergleichen

Die Verteiler können problemlos ignoriert werden. Sie ziemlich viel tun müssen, um nicht einmal wissen, dass sie existieren. Iteratoren sind zwar brillant, und sie aus Bezifferung würden Sie eine Menge Kopfschmerzen ersparen. Es gibt nur drei Konzepte, die Sie müssen verstehen, STL effektiv zu nutzen:

  • Container: Sie haben bereits über diese kennen. Vektoren, verkettete Listen, Karten-Sets, Warteschlangen und so weiter.
  • Iteratoren: Abstraktionen, die Sie einen Container navigieren lassen (oder Teilmengen von einem Behälter oder jede andere Folge von Wert, im Speicher auf der Festplatte in Form von Streams oder on the fly berechnet)
  • .
  • Algorithmen: Common-Algorithmen, die auf arbeiten, um irgendwelche Paar von Iteratoren. Sie haben Art, for_each finden, kopieren und viele andere.

Ja, die STLklein ist im Vergleich zu Java-Bibliothek, aber es packt eine überraschende Menge an Energie, wenn Sie die oben genannten drei Konzepte kombinieren. Es ist ein bisschen eine Lernkurve, weil es eine ungewöhnliche Bibliothek ist. Aber wenn du gehst zu verbringen mehr als ein oder zwei Tage mit C ++, es lohnt sich richtig zu lernen.

Und nein, ich bin nach Ihrem Antwort-Format nicht, weil ich eigentlich dachte, Ihnen eine detaillierte Antwort zu geben wäre hilfreich. ;)

Edit:

Es wäre verlockend zu sagen, dass ein Vorteil der eigenen Walzen ist, dass Sie mehr von der Sprache lernen würden, und vielleicht sogar, warum die STL eines ist seine Spar ziert .. Aber ich bin nicht wirklich überzeugt, es ist wahr. Es könnte funktionieren, aber es kann auch nach hinten losgehen.

Wie ich oben sagte, ist es einfach, C ++ Code zu schreiben, dass scheint zu arbeiten. Und wenn es nicht mehr funktioniert, ist es einfach ein paar Dinge neu zu ordnen, wie die Erklärung der Reihenfolge der Variablen, oder ein wenig Polsterung in einer Klasse einzufügen, um es scheinbar wieder Arbeit. Was würden Sie davon lernen? Wäre das beibringen, wie man besser C ++ schreiben? Vielleicht. Aber wahrscheinlich würde es Ihnen beibringen, nur, dass „C ++ saugt“. Wäre es Ihnen beibringen, wie die STL benutzen? Definitiv nicht. Ein nützlicher Ansatz sein könnte, in dem Lernen STL den richtigen Weg, um die gewaltige Kraft von Stackoverflow verwendet. :)

Andere Tipps

. Nachteil: niemand, aber Sie werden es nutzen

. Vorteil: Im Prozess der Umsetzung erfahren Sie, warum die Standardbibliothek ist eine gute Sache

Vorteile: Ihre eigene dogfood essen. Sie bekommen genau das, was Sie tun.

Nachteile: Ihr eigenes dogfood zu essen. Zahlreiche Menschen, schlauer als 99% von uns haben Jahre damit verbracht, STL zu schaffen.

Ich schlug vor, Sie erfahren, warum:

  

die STL mit spuckt Unmengen von   unverständlich und verstümmelten Compiler   Fehler

erste

Nachteil: Sie können mehr Zeit Debuggen Klassenbibliothek verbringen, als die Lösung, was Universität Aufgabe, die Sie vor Ihnen haben

.

Vorteil: Sie wahrscheinlich eine Menge lernen

!

Es ist etwas, das Sie über die kryptischen Compiler STL Fehlermeldungen zu tun. STLFilt wird ihnen helfen, zu vereinfachen. Vom STLFilt Webseite :

  

STLFilt vereinfacht und / oder reformats   langatmig C ++ Fehler und Warnung   Nachrichten, mit einem Fokus auf STL-bezogene   Diagnose (und für MSVC 6, es vollständig   eliminiert C4786 Warnungen und ihre   Geröll). Das Ergebnis macht viele   selbst die kryptische Diagnostik   verständlich.

Hier finden Sie aktuelle hier und, wenn Sie VisualC verwenden, auch hier .

Ich denke, man sollte es tun.

Ich bin sicher, ich werde dafür bekommen flambayed, aber Sie wissen, hat jeder C ++ Programmierer hier getrunken ein wenig zu viel STL coolaid.

Die STL ist eine große Bibliothek, aber ich weiß aus eigener Erfahrung, dass, wenn Sie Ihre eigene Rolle, können Sie:

1) Machen Sie es schneller als die STL für Ihre speziellen Anwendungsfälle. 2) Sie erhalten eine Bibliothek mit nur den Schnittstellen schreiben Sie benötigen. 3) Sie werden in der Lage, alle Standard-Sachen zu verlängern. (Ich kann Ihnen nicht sagen, wie viel ich habe gewünscht std :: string hatte eine Methode split ()) ...

Jeder hat Recht, wenn sie sagen, dass es eine Menge Arbeit sein wird. Das ist wahr.

Aber, werden Sie eine Menge lernen. Auch wenn, nachdem Sie es schreiben, gehen Sie zurück in die STL und es nie wieder verwenden, werden Sie noch viel gelernt haben.

Nachteil: IMHO, Bibliotheken reimplimenting erprobt und bewährt ist ein Rabbit Hole, die fast ist garantiert mehr Ärger als es wert ist

.

Ein bisschen meiner Erfahrung: Nicht so lange her, habe ich meine eigene Vektor-ähnliche Klasse implementiert, weil ich es eine gute Kontrolle benötigt.

Als ich Genericity erforderlich machte ich einen Templat-Array.

Ich wollte auch durchlaufen nicht Operator [], sondern einen Zeiger wie ein Erhöhen mit C tun würde, so dass ich nicht berechnen die Adresse von T [i] bei jeder Iteration ... ich zwei Methoden hinzugefügt ein zurückzukehren Zeiger auf den zugewiesenen Speicher und eine andere, die einen Zeiger auf das Ende zurückkehrt. Iterieren durch eine Reihe von Integer Ich musste etwas schreiben wie folgt aus:

for(int * p = array.pData(); p != array.pEnd(); ++p){
  cout<<*p<<endl; 
}

Dann, wenn ich anfangen Vektoren von Vektoren zu verwenden, ich herausfinden, dass, wenn es möglich ist, ein ein großen Block von Speichern oft statt Aufruf neu zuweisen könnte. Zu dieser Zeit füge ich ein allocator zur Template-Klasse.

Erst dann merke ich, dass ich einen vollkommen nutzlos Klon von std geschrieben hatte :: vector <>.

Spätestens jetzt weiß ich, warum ich STL verwenden ...

Ein weiterer Nachteil :

Wenn Sie eine C ++ Job bekommen möchten, wenn Sie mit der Universität, die meisten Leute fertig sind, die wollen würden Sie erwarten rekrutieren, dass Sie mit der Standard C ++ Bibliothek vertraut sind. Nicht unbedingt vertraut auf die Ebene der Umsetzung aber sicherlich vertraut mit seiner Verwendung und Idiomen. Wenn Sie das Rad in Form Ihrer eigenen Bibliothek neu implementieren, werden Sie auf diese Chance verpassen. Dies wird nonwithstanding die Tatsache, dass Sie hoffentlich viel über Bibliotheksdesign lernen, wenn Sie Ihre eigene Rolle, die Sie ein paar zusätzliche Pluspunkte könnten verdienen, je nachdem, wo Sie Interview.

Nachteil:

Sie sind die Einführung einer Abhängigkeit von Ihrer eigenen neuen Bibliothek. Selbst wenn dies ausreichend ist, und Ihre Implementierung funktioniert gut, haben Sie immer noch eine Abhängigkeit. Und das können Sie beißen hart mit Code Wartung. Alle anderen (einschließlich sich selbst, in einem Jahr oder sogar einen Monat) nicht mit Ihrer einzigartigen String Verhalten, spezielle Iteratoren, und so weiter kennen. Viel Aufwand wird nur an die neue Umgebung anzupassen benötigt werden, bevor Sie jemals Refactoring / Verlängerung etwas anfangen konnte. Wenn Sie so etwas wie STL verwenden, jeder wird es schon weiß, ist es gut verstanden und dokumentiert, und niemand muss Ihre individuellen Wegwerf-Umgebung neu lernen.

Sie können daran interessiert sein EASTL , dokumentierte eine Weile zurück ein Umschreiben der STL Electronic Arts. Ihre Design-Entscheidungen wurden meist durch die spezifischen Wünsche / Bedürfnisse in Multi-Plattform-Videospiel-Programmierung angetrieben. Die Zusammenfassung in dem verknüpften Artikel bringt es auf.

Nachteil: Sie sind Universitätskurs ist wahrscheinlich wie dies aus einem Grunde gelegt. Die Tatsache, dass Sie gereizt genug sind, um es (Sarkasmus nicht beabsichtigt), kann darauf hindeuten, Sie sind nicht die paridigm bekommen, und wird eine Menge profitieren, wenn Sie einen Paradigmenwechsel haben.

Vorteil:

Wenn Sie in MFC anschauen, werden Sie feststellen, dass Ihr Vorschlag bereits im produktiven Code verwendet wird - und wurde so für eine lange Zeit. Keiner von Collection-Klassen des MFC verwendet die STL.

Warum Sie bei vorhandenen C ++ Bibliotheken einen Blick nicht nehmen. Damals, als C ++ nicht ganz so ausgereift war, schrieben die Menschen oft ihre eigenen Bibliotheken. Hier finden Sie aktuelle Symbian (ziemlich schrecklich obwohl), Qt und WxWidgets (wenn der Speicher dient mir) haben Grund Sammlungen und solche Sachen, und es gibt wahrscheinlich viele andere.

Meine Meinung ist, dass die Komplexität der STL von der Komplexität der Sprache C ++ leitet, und es gibt wenig, was Sie tun können (von der Verwendung einer empfindlicheren Namenskonvention für sie) auf STL zu verbessern. Ich empfehle einfach auf eine andere Sprachumschaltung, wenn Sie können, oder einfach nur damit umgehen.

  

Als Beispiel spuckt die STL aus   Unmengen von unverständlichen und verstümmelten   Compilerfehler

Der Grund hierfür ist im Wesentlichen C ++ Vorlagen. Wenn Sie Vorlagen verwenden (wie STL tut) werden Sie r eams unverständlicher Fehlermeldungen. Also, wenn Sie Ihre eigene Vorlage basiert Collection-Klassen implementieren Sie in keinem besseren Ort sein wird.

Sie könnten nicht Vorlage basiert Container machen und speichern alles als void-Zeiger oder eine Basisklasse z.B. Aber Sie würden verlieren Zeit Typprüfungen und C ++ saugt als dynamische Sprache kompilieren. Es ist nicht so sicher, dies zu tun, wie es beispielsweise in sein würde, Objective-C, Python oder Java. Einer der Gründe dafür ist, dass C ++ nicht eine Stammklasse für alle Objekte und einige grundlegende Fehler für alle Klassen an alle Innerlichkeit hat zur Laufzeit der Handhabung. Stattdessen Ihre Anwendung würde wahrscheinlich abstürzen und brennen, wenn Sie über die Art falsch waren, und Sie würden keine Hinweise auf gegeben werden, was falsch gelaufen ist.

Nachteil : Neuimplementierung alle von der und (das heißt, auf einem hohen Qualitätsniveau) wird sicherlich eine Reihe von großen Entwickler nehmen ein paar Jahren.

  

Was sind die Gefahren, mögliche Nachteile und mögliche Vorteile auf „meine eigenen Rollen“ für die meisten der bestehenden Funktionalität in C ++?

Können Sie sich und möglicherweise den Aufwand / Zeit / Geld rechtfertigen hinter das Rad neu erfinden verbracht?

  

Die Wiederverwendung von Schub oder ähnlich.

Rather seltsam, dass Sie nicht-Boost verwenden können. IIRC, Brocken Beitrag kommen von Menschen im Zusammenhang mit / Arbeiten an Universitäten (man denke Jakko Jarvi). Die upsides von Boost sind viel zu viele um sie hier aufzulisten.

  

Ein nicht 'das Rad neu erfinden'

. Nachteil: Während man viel lernen, Sie setzen auch selbst zurück, wenn Sie kommen zu denken, was Ihre wirklichen Projektziele sind

. Vorteil: Die Wartung ist einfacher für die Leute, die diese erben werden

STL ist sehr komplex, da es sich um eine Allzweckbibliothek handelt.

Gründe, warum STL so ist, wie es ist:

  • Basierend auf Interatoren benötigen Standardalgorithmen daher nur eine einzige Implementierung für verschiedene Arten von Containern.
  • Entwickelt, um sich angesichts von Ausnahmen ordnungsgemäß zu verhalten.
  • Entwickelt, um in Multithread-Anwendungen „threadsicher“ zu sein.

In vielen Anwendungen reicht Ihnen jedoch wirklich Folgendes aus:

  • String-Klasse
  • Hash-Tabelle für O(1)-Suchen
  • Vektor/Array mit Sortierung / und binärer Suche nach sortierten Sammlungen

Wenn Sie das wissen:

  • Ihre Klassen lösen keine Ausnahmen bei der Konstruktion oder Zuweisung aus.
  • Ihr Code ist Single-Threaded.
  • Sie werden die komplexeren STL-Algorithmen nicht verwenden.

Dann können Sie wahrscheinlich Ihren eigenen schnelleren Code schreiben, der weniger Speicher benötigt und einfachere Kompilierungs-/Laufzeitfehler erzeugt.

Einige Beispiele für schneller/einfacher ohne STL:

  • Copy-on-Write-String mit referenzgezähltem String-Puffer.(Tun Sie dies nicht in einer Multithread-Umgebung, da Sie den Zugriff auf den Referenzzähler sperren müssten.)
  • Verwenden Sie eine gute Hash-Tabelle anstelle von std::set und std::map.
  • Iteratoren im „Java“-Stil, die als einzelnes Objekt weitergegeben werden können
  • Iteratortyp, der den Typ des Containers nicht kennen muss (zur besseren Entkopplung des Codes zur Kompilierungszeit)
  • Eine String-Klasse mit mehr Hilfsfunktionen
  • Konfigurierbare Grenzen, die Ihre Vektorcontainer überprüfen.(Also nicht [] oder .at, sondern dieselbe Methode mit einem Kompilierungs- oder Laufzeitflag für den Wechsel vom „sicheren“ in den „schnellen“ Modus)
  • Container, die so konzipiert sind, dass sie mit Zeigern auf Objekte arbeiten, die deren Inhalt löschen.

Es sieht aus wie Sie die Frage so jetzt aktualisiert gibt es eigentlich zwei Fragen:

  1. Was soll ich tun, wenn ich die std :: Bibliothek denken, ist zu komplex für meine Bedürfnisse?

Ihre eigenen Klassen-Design, das intern relevant std :: Bibliotheks-Features, die „schweres Heben“ für Sie tun. Auf diese Weise kann weniger müssen falsch, und Sie immer noch Ihre eigene Codierung Schnittstelle erhalten zu erfinden.

  1. Was soll ich tun, wenn ich lernen, wie man Datenstrukturen arbeiten?

Gestalten Sie Ihre eigenen Satz von Datenstrukturklassen von Grund auf. Dann versuchen Sie herauszufinden, warum die Standard diejenigen sind besser.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top