Neue C++-Version erschienen: Was sich in der Programmiersprache geändert hat
Das internationale Komitee für die C++-Standardisierung (ISO/IEC JTC1/SC22/WG21) hat offiziell die nächste Version des Standards verabschiedet – C++23. Diese Version bringt lang erwartete Verbesserungen, die die Sprache sicherer, ausdrucksstärker und benutzerfreundlicher für die Entwicklung sowohl von System- als auch von Anwendungssoftware machen. Wir berichten über die bedeutendsten Neuerungen.
Die wichtigsten Änderungen in C++23
1. std::print – formatierte Ausgabe ohne überflüssigen Aufwand
Eine der auffälligsten Funktionen ist die Einführung der Funktion std::print. Für die Ausgabe in den Standard-Stream müssen nun keine umständlichen Konstrukte mit std::cout mehr geschrieben oder printf mit dem Risiko von Typfehlern verwendet werden. std::print basiert auf std::format und gewährleistet Typsicherheit und Lesbarkeit:
- Automatische Formatierung von Zahlen, Zeichenketten und benutzerdefinierten Typen.
- Unterstützung von Locales und Unicode.
- Geschwindigkeit nahe an
printf, jedoch ohne Speicherlecks.
2. Verbesserte Arbeit mit Coroutinen
Coroutinen, die erstmals in C++20 eingeführt wurden, haben eine Reihe von Korrekturen und Ergänzungen erhalten. In C++23 wurde die Syntax für die Deklaration asynchroner Funktionen vereinfacht und die Unterstützung für std::generator hinzugefügt – einen neuen Typ zur Erstellung von Wertesequenzen im laufenden Betrieb:
- Generatoren ermöglichen das Schreiben von lazy evaluations ohne manuelle Zustandsverwaltung.
- Der Umfang von Boilerplate-Code für die Arbeit mit Coroutinen wurde reduziert.
3. Module – Stabilität und Leistung
Obwohl Module in C++20 eingeführt wurden, ließ ihre Implementierung in Compilern zu wünschen übrig. Im neuen Standard wurden die Regeln für Export und Import präzisiert, was zu Folgendem führte:
- Verkürzung der Kompilierzeit großer Projekte um das 2- bis 3-fache.
- Vollständige Kompatibilität mit Header-Dateien (Hybridmodus).
- Möglichkeit, Module für die Standardbibliothek zu erstellen (experimentell).
4. Neue Möglichkeiten von constexpr und consteval
Die Erweiterung des Kontexts konstanter Ausdrücke ist eines der Hauptziele der C++-Entwicklung. In C++23 ist die Verwendung von constexpr erlaubt für:
- Dynamische Speicherzuweisung (
std::vectorundstd::string). - Aufruf virtueller Funktionen.
- Arbeit mit Gleitkommazahlen ohne Genauigkeitsverlust.
Dies ermöglicht es, immer mehr Berechnungen zur Kompilierzeit durchzuführen und so die Laufzeit zu beschleunigen.
5. Attribut [[assume]] – Hinweise für den Optimierer
Das neue Attribut [[assume(Ausdruck)]] teilt dem Compiler mit, dass der Ausdruck an dieser Stelle im Code wahr ist. Dies ermöglicht:
- Aggressivere Optimierungen (Entfernung von Verzweigungen, Schleifenfaltung).
- Leistungssteigerung in kritischen Bereichen (Spiele-Engines, Embedded).
6. Vereinfachung der Multithreading-Programmierung
Es wurden neue Typen für die Synchronisation hinzugefügt: std::counting_semaphore mit verbesserter Leistung und std::latch für einmalige Barrieren. Darüber hinaus wurde die Unterstützung für std::mdspan