Was kann C++ zu tun, dass ist zu hart oder chaotisch in einer anderen Sprache?

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

  •  05-07-2019
  •  | 
  •  

Frage

Ich fühle mich immer noch C++ bietet einige Dinge, die nicht geschlagen werden kann.Es ist nicht meine Absicht zu Anfang eine Flamme, Krieg hier, bitte, wenn Sie starke Meinungen über nicht zu mögen C++ nicht entlüften Sie hier.Ich bin daran interessiert zu hören, von C++ - gurus, warum Sie bleiben.

Ich bin besonders daran interessiert, Aspekte von C++, die wenig bekannt sind, oder mindernutzung.

Edit: Leute, bitte mindestens ein flüchtiges Lesen der anderen Antworten, um sicherzustellen, dass Sie nicht duplizieren, was bereits gesagt wurde, wenn Sie einverstanden sind mit dem, was jemand anderes gesagt hat, upvote it!

War es hilfreich?

Lösung

Ich habe mit C ++ geblieben, da es immer noch die leistungsfähigste Mehrzwecksprache für Anwendungen, die Effizienz kombinieren müssen und Komplexität. Als Beispiel schreibe ich Echtzeit Oberflächenmodellierungssoftware für Handheld-Geräte für die Vermessungsbranche. Angesichts der begrenzten Ressourcen, Java, C #, etc ... liefern nicht nur die notwendigen Leistungsmerkmale, während niedrigere Sprachen wie C viel langsamer sind in Anbetracht der schwächeren Abstraktion Eigenschaften zu entwickeln. Die Palette der Abstraktionsebenen zur Verfügung zu einem C ++ Entwickler ist riesig, bei einer Extrem kann ich arithmetische Operatoren so eine Überlastung, dass ich etwas sagen kann, wie MaterialVolume = Designsurface - GroundSurface , während zur gleichen Zeit läuft eine Reihe verschiedene Haufen die Speicher am effizientesten für meine Anwendung auf einem bestimmtes Gerät zu verwalten. Kombinieren Sie dies mit einer Fülle von frei verfügbarer Quelle für so ziemlich jedes gemeinsames Problem zu lösen, und Sie haben ein Heck einer leistungsfähigen Entwicklungssprache.

Ist C ++ noch die optimale Entwicklung Lösung für die meisten Probleme in den meisten Domains? Wahrscheinlich nicht, obwohl bei einer Prise kann es immer noch für die meisten von ihnen verwendet werden. Ist es immer noch die beste Lösung für die effiziente Entwicklung von Hochleistungs-Anwendungen? IMHO ohne Zweifel.

Andere Tipps

RAH / deterministische Finalisierung . Nein, Garbage Collection ist nicht nur so gut , wenn Sie mit einer knappen, gemeinsam genutzte Ressource zu tun hat.

uneingeschränkter Zugriff auf OS APIs .

Schießen selbst in den Fuß.

Keine andere Sprache bietet eine solche kreative Reihe von Werkzeugen. Pointers, Mehrfachvererbung, Vorlagen, Überladen von Operatoren und ein Präprozessor.

Eine wunderbar kraftvolle Sprache, die auch reichlich Möglichkeiten für Fuß Schießen bietet.

Edit: Ich entschuldige mich, wenn mein lahmer Versuch, Humor einige beleidigt hat. Ich halte C ++ die stärkste Sprache sein, die ich je benutzt habe - mit Fähigkeiten in der Assemblersprache Ebene zu codieren, wenn gewünscht, und auf einem hohen Abstraktionsniveau, wenn gewünscht. C ++ hat meine primäre Sprache seit den frühen 90er Jahren gewesen.

Meine Antwort wurde auf jahrelanger Erfahrung basiert selbst in den Fuß zu schießen. Mindestens C ++ ermöglicht es mir, so elegant zu tun.

deterministische Objekt Zerstörung führt zu einigen großartigen Design-Muster. Zum Beispiel, während RAII nicht als allgemein eine Technik, die als Garbage Collection ist, führt es zu einigen beeindruckenden Fähigkeiten, die Sie nicht mit GC bekommen kann.

C ++ ist auch insofern einzigartig, als es eine Turing-complete Präprozessor hat. Auf diese Weise können Sie (wie im Gegenteil von defer) eine Menge Code Aufgaben bevorzugen Zeit statt Laufzeit zu kompilieren. Zum Beispiel in echtem Code möglicherweise eine assert () Anweisung testen für ein nie passieren. Die Realität ist, dass es früher oder später passieren wird ... und um 3:00 Uhr passieren, wenn Sie im Urlaub sind. Die C ++ Präprozessor assert macht den gleichen Test bei der Kompilierung. Kompilieren Zeit behauptet, von 8.00 bis 05.00 Uhr nicht, während Sie vor dem Computer sitzen, den Code zu bauen beobachten; Laufzeit behauptet, um 3:00 Uhr fehlschlagen, wenn Sie schlafen in Hawai'i sind. Es ist ziemlich einfach, den Sieg dort zu sehen.

In den meisten Sprachen, Strategiemuster werden zur Laufzeit erfolgen und Ausnahmen im Fall eines Typenkonflikt werfen. In C ++ können Strategien zur Compile-Zeit durch die Prä-Prozessor-Anlage durchgeführt werden und können typsicher garantiert werden.

Write Inline-Assembler (MMX, SSE, usw.).

deterministisches Objekt Zerstörung. D. h Echt Destruktoren. Macht die Verwaltung knapper Ressourcen erleichtert. Ermöglicht RAII.

Einfacher Zugriff auf strukturierte Binärdaten. Es ist einfacher, einen Speicherbereich als eine Struktur zu werfen, als sie zu analysieren und jeden Wert in eine Struktur kopieren.

Mehrfachvererbung. Nicht alles kann mit Schnittstellen erfolgen. Manchmal möchte man auch tatsächliche Funktionalität erben.

Ich glaube, ich bin nur C gehen zu loben ++ für seine Fähigkeit, Vorlagen zu verwenden, um Ausdrücke zu fangen und es träge auszuführen, wenn sie gebraucht wird. Für diejenigen, die nicht wissen, worum es geht, hier ist ein Beispiel.

Template Mixins Wiederverwendung zur Verfügung stellen, die ich nicht an anderer Stelle gesehen haben. Mit ihnen können Sie ein großes Objekt mit vielen Verhalten aufzubauen, als ob man das Ganze von Hand geschrieben hatte. Aber all diese kleinen Aspekte ihrer Funktionalität kann wiederverwendet werden, es ist besonders groß für Teile einer Schnittstelle (oder die ganze Sache) zur Umsetzung, wo Sie eine Reihe von Schnittstellen implementieren. Das resultierende Objekt ist blitzschnell, weil es alle inlined wird.

Die Geschwindigkeit kann nicht viele Fälle Rolle in, aber wenn Sie Komponentensoftware schreiben, und Benutzer-Komponenten in ungeahnten komplizierter Weise kombinieren kann, Dinge zu tun, die Geschwindigkeit des inlining und C ++ scheint vielen komplexere Strukturen zu ermöglichen, zu sein erstellt.

Absolute Kontrolle über das Speicherlayout, Ausrichtung und den Zugriff, wenn Sie es brauchen. Wenn Sie vorsichtig genug sind, können Sie einige sehr Cache freundliche Programme schreiben. Für Multi-Prozessor-Programme können Sie auch eine Menge langsam Tiefen von Cache-Kohärenz-Mechanismen beseitigen.

(Okay, Sie können dies tun, in C, Montage und wahrscheinlich Fortran auch. Aber C ++ können Sie den Rest des Programms auf einem höheren Niveau zu schreiben.)

Dies wird wahrscheinlich nicht eine beliebte Antwort sein, aber ich denke, was C ++ setzt auseinander sind die Kompilierung-Fähigkeiten, zum Beispiel Vorlagen und #define. Sie können auf Ihrem Programm alle Arten von Textmanipulation tun diese Funktionen verwendet, von denen viele im Namen der Einfachheit in späteren Sprachen aufgegeben wurde. Für mich ist viel wichtiger als jedes Low-Level-Bit Hantieren das ist angeblich leichter oder schneller in C ++.

C #, zum Beispiel, hat keine echte Makro-Anlage. Sie können nicht eine andere Datei direkt in die Quelle # include, oder verwenden Sie #define das Programm als Text zu manipulieren. Denken Sie an jederzeit Sie mechanisch wiederholenden Code hatten zu schreiben und Sie wussten, dass es ein besserer Weg. Sie können sogar ein Programm zu generieren Code für Sie geschrieben haben. Nun, die C ++ Präprozessor automatisiert all diese Dinge.

Die „Generika“ -Anlage in C # ähnlich im Vergleich beschränkt sich auf C ++ Vorlagen. C ++ können Sie den Punktoperator auf einen Vorlagentyp T blind anwenden, nennen (zum Beispiel) Methoden, die möglicherweise nicht vorhanden sind, und prüft-for-Korrektheit nur dann angewendet, wenn die Vorlage tatsächlich auf eine bestimmte Klasse angewendet wird. Wenn das passiert, wenn alle Annahmen, die Sie über T tatsächlich halten, dann werden Sie den Code kompilieren. C # nicht zulässt, dass dieser ... Typ „T“ im Grunde mit als Objekt behandelt werden muss, dh nur die kleinsten gemeinsamen Nenner von Operationen zur Verfügung, um alles mit (Zuordnung, GetHashCode (), Equals ()).

C # hat sich mit dem Prä-Prozessor beseitigt und echte Generika, im Namen der Einfachheit. Leider, wenn ich C # verwenden, finde ich mich für diese C für Ersatz zu erreichen ++ Konstrukte, die zwangsläufig mehr aufgebläht und Schicht als der C ++ Ansatz sind. Zum Beispiel habe ich Programmierer arbeiten in mehreren aufgeblähten Möglichkeiten, um das Fehlen von #include gesehen: dynamisch auf externe Baugruppen verbinden, neu zu definieren Konstanten in verschiedenen Orten (eine Datei pro Projekt) oder die Auswahl Konstanten aus einer Datenbank usw.

Als Frau Crabapple von The Simpson hat einmal gesagt, das ist "ziemlich lahm, Milhouse."

Im Hinblick auf die Informatik, diese Kompilierung-Features von C ++ ermöglichen Dinge wie Call-by-name Parameterübergabe, die als Call-by-Wert sein mächtiger bekannt ist und Call-by-reference.

Auch dies ist vielleicht nicht die beliebte Antwort- jeden einleitenden C ++ Text finden Sie ab von #define warnen, zum Beispiel. Aber mit einer Vielzahl von Sprachen über viele Jahre gearbeitet haben, und hinter all diese Überlegung in die Theorie gegeben zu haben, denke ich, dass viele Menschen schlechte Ratschläge geben. Dies scheint insbesondere dann der Fall in dem verdünnten Unterfeld als bekannt zu sein „IT“.

Technisch, ich glaube, es gibt keine, wirklich!

Ich glaube ehrlich gesagt nicht, dass es etwas gibt, das C ++ tun kann, welche Die D Sprache nicht. Egal, welche Fähigkeit C ++ hat, ist es immer schwieriger und unübersichtlicher als D oder eine andere Sprache. Selbst eine einfache Sache wie eine Klassendeklaration ist so viel schwieriger und unübersichtlicher in C ++ als jede andere Sprache.

Das einzige, was C ++ tun kann, ist mit Millionen von Zeilen Code bereits geschrieben in C ++ kompatibel sein.
Dies ist die einzige Sache, die keine andere Sprache als C ++ tun können:)

Passing POD Strukturen über Prozesse mit minimalem Aufwand. Mit anderen Worten erlaubt es uns leicht zu Blobs von binären Daten zu umgehen.

C # und Java Kraft Sie Ihre 'main ()' Funktion in einer Klasse zu setzen. Ich finde, dass seltsam, weil es die Bedeutung einer Klasse verdünnt.

Für mich ist eine Klasse, eine Kategorie von Objekten in Ihrer Problemdomäne. Ein Programm ist nicht ein solches Objekt. So sollte es nie eine Klasse namens ‚Programm‘ in Ihrem Programm. Dies wäre gleichbedeutend mit einem mathematischen Beweis ein Symbol mit sich selbst zu notieren - der Beweis - neben Symbole für mathematische Objekte. Es wird nur seltsam und widersprüchlich sein.

Zum Glück, im Gegensatz zu C # und Java, C ++ ermöglicht globale Funktionen. Das läßt Ihre main () Funktion außerhalb existieren. Daher C ++ bietet eine einfachere, konsistentere und vielleicht wahrere Umsetzung des objektorientierten Idiom. Daher ist dies eine Sache C ++ tun können, aber C # und Java nicht.

Ich denke, dass Betreiber Überlastung ein ganz nettes Feature ist. Natürlich kann es sehr viel (wie in Boost-Lambda) missbraucht werden.

Eine strenge Kontrolle über die Systemressourcen (insb. Speicher) und bietet gleichzeitig leistungsstarke Abstraktionsmechanismen optional. Die einzige Sprache, die ich kenne, kann nahe an C ++ in dieser Hinsicht ist Ada.

C++ bietet vollständige Kontrolle über die Erinnerung und als Ergebnis eine macht, die den Fluss der Programmausführung viel mehr vorhersehbar.Sie können nicht nur genau sagen, zu welcher Zeit die Zuweisungen und deallocations des Speichers Auftritt, können Sie legen Sie Ihren eigenen Haufen, haben mehrere Haufen für verschiedene Zwecke und genau sagen, wo die in-memory-Daten zugeordnet ist.Dies ist Häufig sinnvoll, bei der Programmierung auf embedded/real-time-Systeme, wie Spiele-Konsolen, Handys, mp3 Spieler, etc..., die:

  1. strikte Obere Grenzen für Speicher, die ist einfach zu erreichen (kontrastieren mit einem PC wird immer langsamer, als Sie aus dem physischen Speicher)
  2. Häufig haben nicht homogen-Speicher-layout.Möglicherweise möchten Sie Objekte zuweisen eines Typs in einem Stück von physikalischen Speicher, und Objekte eines anderen Typs in einem anderen Stück.
  3. haben Echtzeit-Programmierung Einschränkungen.Unerwartet ruft der garbage collector zur falschen Zeit, kann katastrophal sein.

AFAIK, C und C++ sind die einzig sinnvolle option für diese Art der Sache.

Nun ganz ehrlich zu sein, können Sie tun einfach alles, wenn Ihr bereit genug Code zu schreiben.

So Ihre Frage zu beantworten, nein, gibt es nichts, was man nicht in einer anderen Sprache tun kann, die C ++ nicht tun können. Es ist nur, wie viel Geduld haben Sie und sind Sie bereit, die lange schlaflose Nächte zu widmen, um es an die Arbeit?

Es gibt Dinge, die C ++ Wrapper, es zu tun einfach machen (weil sie die Header-Dateien lesen können), wie Office-Entwicklung. Aber auch hier ist es, weil jemand viele Code geschrieben zu „wrap“ es für Sie in einem RCW oder „Runtime Callable Wrapper“

EDIT:. Sie auch klar, dass das eine geladene Frage ist

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