Modernes C ++! = (Most) New Standard

Ursprünglicher Autor: Arne Mertz
  • Übersetzung


Der Begriff "modernes C ++" wird häufig als Synonym für den Ausdruck "Code unter Verwendung des neuen C ++ - Standards" verwendet. Hier kann „neu“ alles von C ++ 11 bis C ++ 17 bedeuten oder sogar das, was bereits in C ++ 20 verfügbar ist. Ich denke, modernes C ++ ist mehr als das Hinzufügen des Flags -std = c ++ 17 .

Was heißt modern?


Wenn wir die Bedeutung des Wortes "modern" im Netz suchen, werden wir als eines der ersten eine Definition aus dem Merriam-Webster-Wörterbuch finden . Hier sind zwei Teile, die sich auf C ++ beziehen:

[...]

2: Einbeziehung neuerer Techniken, Methoden oder Ideen: (aktuelle) moderne Kommunikationsmethoden

3 aktiviert: von, in Bezug auf oder mit den Eigenschaften der Gegenwart oder letzte Periode der Entwicklung einer Sprache - Modernes Englisch

[...]

Techniken, Methoden und Ideen beziehen sich nicht nur auf neue Sprachfunktionen. Oft unterstützen oder beinhalten diese neuen Funktionen neue Techniken, aber viele von ihnen gibt es schon seit geraumer Zeit. Die Merkmale der Sprachentwicklung basieren darauf, wie wir die Sprache verwenden. Dies bezieht sich darauf, wie wir alte und neue Funktionen kombinieren. Dies ist mehr als nur ein funktionierendes C ++ - Programm oder etwas, das in der Standardbibliothek enthalten ist.

Man kann argumentieren, dass die Fähigkeiten, die seit C ++ 98 existieren, nicht Teil des modernen C ++ sind, weil sie zu lange existieren. Es muss jedoch daran erinnert werden, dass die aktivsten Menschen in der Community, die über „modernes C ++“ sprechen oder schreiben, am häufigsten Pioniere sind. Die meisten verwenden, studieren und unterrichten sogar das gute alte „C mit Klassen“ aus den 90er Jahren, wodurch viele der Methoden, die dort nicht verwendet werden, Teil des modernen C ++ sind.

Über neue Funktionen hinaus


Welches der in C ++ 98 verfügbaren Programme gehört meiner Meinung nach zur Kategorie „modernes C ++“? Hier ist eine unvollständige Liste einiger wichtiger Funktionen und Ideen:

RAII


RAII steht für "Eine Ressource zu bekommen ist Initialisierung" oder "Eine Verantwortung zu bekommen ist Initialisierung". Obwohl sich der Name auf "Initialisierung" konzentriert, ist der entscheidende Teil hier tatsächlich der Destruktor. Die entschlossene Freigabe von Ressourcen ist eines der Hauptmerkmale von C ++, das es von den meisten anderen Sprachen unterscheidet. Für viele ist dies das wichtigste Merkmal.

Mit RAII können viele Dinge zuverlässig verwaltet werden, z. B. Speicher (z. B. std :: vector, std :: string ) und Dateideskriptoren ( std :: fstream)), Netzwerkverbindungen, Mutexe, Datenbankverbindungen sowie Entitäten, die in entfernter Beziehung zu Ressourcen stehen. Wenn Sie eine zuverlässige Methode zum Ausführen einer Aktion benötigen und diese dann abbrechen möchten, wenn Sie einen bestimmten Bereich verlassen oder ein Objekt zerstören, ist RAII genau das, was Sie benötigen.

Ich habe eine Menge Code gesehen, in dem die manuelle Reinigung am Ende der Funktionen zu einem Albtraum wurde. In Ausnahmefällen findet eine solche Reinigung nicht statt. In diesem Fall ist RAII genau das, was Sie benötigen . Selbst wenn Sie keine Ausnahmen verwenden, kann ein vorzeitiges Beenden von Funktionen den Code erheblich verbessern, allerdings nur, wenn Sie ihn nicht bereinigen müssen.

Die RAII-Technik ist definitiv Teil des modernen C ++, obwohl sie von Anfang an verfügbar war.

Starkes Tippen


Die Idee des starken Tippens war in letzter Zeit sehr beliebt. In der Vergangenheit wurden Kennungen, Größen, Postleitzahlen, Preise usw. durch int oder double oder einen anderen arithmetischen Typ dargestellt. Die Tatsache, dass sie kompatibel und völlig unabhängig voneinander waren und rein zufällig vom selben Typ sind, war eine Fehlerquelle, aber was kann ich tun? Zumindest wandelt der Compiler Zahlen und Arrays nicht stillschweigend in Strings um !

Tatsächlich hat sich herausgestellt, dass das C ++ - Typensystem und die Null-Kosten-Abstraktionen, die der Compiler bereitstellt, viel bewirken können. Erstellen Sie einfach verschiedene Typen für Bezeichner, Postleitzahlen, Größen (nein, kein typedef, danke) und so weiter. Wenn Sie interessiert sind, lesen Sie einen der Berichte von Björn Fahller., Jonathan Boccara oder Jonathan Müller .

* (Auch wenn die Kosten für die Abstraktion nicht Null sind, beweisen Sie, dass sie inakzeptabel sind, bevor Sie sie aufgeben.)

Abgesehen von einigen neueren Ergänzungen,war von Anfang an in der Standardbibliothek. Wenn man sich den Code anschaut, stellt sich heraus, dass die Leute es oft vorziehen, Schleifen manuell zu schreiben. Die Gründe reichen von der Unkenntnis der verfügbaren Standardalgorithmen bis zur Annahme, dass „Vorlagen zu langsam“ sind (häufig ohne Erklärung im Vergleich zu was).

Programmierung der Übersetzungsphase


Dinge wie die Metaprogrammierung mit Vorlagen werden seit C ++ 98 verwendet. Logik, die zur Kompilierungszeit ausgeführt wird, kann die Komplexität zur Laufzeit erheblich verringern. In der Vergangenheit war die Verwendung unbequem. Die Syntax der Vorlagen unterscheidet sich in Richtung der Komplexität von den Funktionen, die in den neuesten Standards enthalten sind. Dies ist so etwas wie eine separate Sprache, die wir lernen müssen. Dinge wie das Versenden von Tags oder Eigenschaften sind jedoch nicht zu kompliziert zu verwenden und zu schreiben.

Ja, die meisten Merkmale in der Standardbibliothek sind mit dem Aufkommen von C ++ 11 erschienen, aber es ist nicht so , dass Sie sie an Ihre Bedürfnisse anpassenschwierig, und einige der häufigsten waren in Boost vor C ++ 11. Ich denke darüber nach, den Kompilierungsstufen-Logik-Teil von modernem C ++ zu verwenden, weil er C ++ von dem allgegenwärtigen „C mit Klassen“ trennt.

Fazit


Modernes C ++ bezieht sich nicht auf neue Standards, sondern auf die Art und Weise, wie wir unsere Programme schreiben. Erstens kann C ++ 98 in einem mehr oder weniger modernen Stil geschrieben werden. Zweitens ist „C mit Klassen und bereichsbasierten for-Schleifen“ noch kein modernes C ++. Neue Funktionen der Sprache und der Bibliotheken helfen uns, im Stil von modernem C ++ zu schreiben, aber sie machen unseren Code nicht zu modernem C ++.

Jetzt auch beliebt: