cppmod2023W41
Der jeweils aktuellste Seiteninhalt steht immer ganz am Anfang (damit Sie nicht suchen müssen).
Einführung zu Co-Routines (sieht auf den ersren Blick ganz vielversprechend aus):
https://www.incredibuild.com/blog/cpp-coroutines-lets-play-with-them
Spreadsheet zur Themenauswahl:
https://docs.google.com/spreadsheets/d/1ksBk1D-jUXnC4iypH_CJaVACs7DF4Oxq7xwrhd5pxWI/edit?usp=sharing
Es dient für mich als Orientierungshilfe, wo ich eher SCHWERPUNKTE setzen sollte oder was eher als VERZICHTBAR betrachtet wird. Betrachten Sie den folgenden Abschnitt "weitere geplante Themen" als meine Default-Auswahl. Wenn Sie mit dieser einverstanden sind, brauchen Sie das Spreadsheet nicht auszufüllen.
Geplante Einzelthemen – da diese nicht Voraussetzung für anderes sind, können sie zu beliebigen Zeitpunkten eingeschoben werden:
- ein Beispiel, bei dem `decltype` nützlich sein kann (es gibt aber auch eine Alternative)
https://godbolt.org/z/fKx4dPPe9 - Typ-Aliase mit `using` (analog typedef aber andere Syntax)
- constexpr, consteval und constinit
(garantierte Compile-Zeit Initialisierung bzw. zur Compilezeit ausgeführte Funktionen) - Nützliche Hilfsklassen: std::optional, std::any, std::variant
Geplante Themengruppen – im Rahmen einer Priorisierung eher als Gesamt-Thema zu behandeln
- RV: Rvalue References – "Copy vs. Move", Best Practices
- SP: Smart Pointer - einfachere Verwaltung von Heap-Speicher
- TU: Tuple (Prinzipielle Verwendung sowie "strucured Bindinding")
- MT: Multi-Threading (Überblick mit einigen Beispielen)
- Filesystem Sub-Library (Überblick warum und was wozu)
- Chrono Sub-Library (Überblick und auf Wunsch Beispiel-Code)
- TP: Templates Erweiterungen gegenüber C++98 (eher kleinere Dinge, setzt voraus, dass Templates als C++Sprach-Feature grundsätzlich bekannt sind)
- MP: "Optimierung" von Programmen durch "eingeplante Code-Variationen" zur Compilezeit (beruht auf fortgeschritteneren Anwendung von Templates)
Themen, bei denen ich selbst noch etwas meine Kenntnisse vertiefen müsste, wenn mehr als ein kurzer Überblick gewünscht wäre:
- C++20 Modules (keine Header-Files mehr)
- Co-Routines ("Schleifen", die "in der Mitte" in der Mitte einen Wert liefern und später nach diese Stelle fortgesetzt werden können; u.a. bekannt aus Python)
- Concepts – "schärfere Definition" welche Datentypen für eine Template akzeptabel sind, die (hoffentlich) zu etwas besser verständlichen Fehlermeldungen führen
Ab hier folgen die bisher behandelten Inhalte chronologisch:
Montag
Lambda Einführung und Motivation: https://godbolt.org/z/Kxvbnza3h
- Mitbehandelte Aspekte:
- C++:
- Bereichsbasierte Schleife
- Vergleich mit Pointer-Variante
- Generell:
- Benutzung des "Godbolt Compiler Explorers"
- C++:
- Thema in Schulungsunterlagen Seiten ...
auto als Typ von Variablen
- es handelt sich nach wie vor um eine "feste Typisierung" zur Compile-Zeit
- der Typ wird aus dem Initialwert bestimmt
- von diesem fällt zunächst const (und volatile) und weg
- nicht aber wenn explizit ein Zeiger oder eine Referenz vereinbart wird
decltype zur Bestimmung des Typs eines Ausdrucks
- selten benötigtes Feature aber wenn man es doch mal benötigt sehr nützlich
- bei Angabe einer Variablen als Argument wird GENAU deren Typ geliefert
- bei Angabe eines AUSDRUCKS wird dessen Typ geliefert, ggf. als REFERENZ-Typ, wenn der Ausdruck "Speicherplatz" referenziert, von dem man die Adresse ermitteln könnte
Uniform Initialization / Initialisierungs-Listen (std::initializer_list)
- Prinzipiell relativ "einfach" zu nutzenden Features
- AberVorsicht wegen Mehrdeutigkeiten
- im Zusammenhang mit Initialisierungs-Listen aus genau einem Element bei Konstrukturen, die alternativ diesen Typ als einzelnes Argument verstehen
"Strongly Typed" und "Scoped" enums (enum class)
- Achtung, nicht falsch verstehen:
das sind keine "wirklichen" Klassen (mit Member-Daten und -Funktionen) - es kann optional der zugrunde zu legende Datentyp angegeben werden:
- das geht nicht nur bei `enum class` sondern auch bei den aus C übernommenen enum-s
- es kann für "Vorwärtsdeklarationen" nützlich sein
Bereichsbasierte Schleifen
- neue (zusätzliche) Syntax der for-Anweisung
- ab C++20 ist auch ein Initialisierungsausdruck möglich
https://godbolt.org/z/Md4oMerv5
Dienstag
Zu Beginn Live-Demo verschiedener C++11 Mechanismen an einem motivierenden Beispiel
- decltype, std::remove_reference, std::set, iteraror_traits, templates
RValue Referenzen
- Verwendete Live-Demo: https://godbolt.org/z/jf8e4qWYT
- Prinzipiell ein weiterer Datentyp, mit dessen Hilfe zusätzliche Überladungen einer Funktion definiert werden können
- sie garantieren, dass das tatsächliche Argument nur "temporären" Speichreplatz hat (tecnisch: ein "xvalue")
- "wertvolle Bestandteile" eines als Rvalue-Referenz in Empfang genommenen Arguments können somit weiterverwendet werden
- es muss lediglich sichergestellt sein, dass dieser "xvalue" in einem Zustand verbleibt, in dem der Destruktor.
- Zu 99,9% werden diese Überladungen eingesetzt um kopierenden Operationen eine "move"-Version zur seite zu stellen.
- Wenn Sie diese praktisch "ausprobieren" wollen, lassen Sie sich nicht täuschen durch Compiler die RVO oder NRVO anwenden
- ein "move"-Construktor wird damit oft "weg-optimiert"
- um ihn zu sehen verwenden Sie die Compiler-Option -fno-elide-constructors
- ab C++17 wird die Verwendung von (N)RVO durch den Compiler aber verpflichtend und die obige Option stillschweigend ignoriert
- Zusamenfassung von Best-Practices hier
Smart-Pointer
- siehe Infografik: https://tbfe.de/data/uploads/infographics/SmartPointers.png
- Beispiel aus Schulungsunterlage mit "Coliru"-Online Compiler umkopiert auf Gotbolt Compiler Explorer: https://godbolt.org/z/chYx7x7bc
std::tuple (inkl. "structured binding")
- Performance Vergleich: https://godbolt.org/z/YY38rsr54
Mittwoch
https://godbolt.org/z/7zreexM6K <---- Publisher / Subscriber
https://godbolt.org/z/oPd5E1zaf
https://godbolt.org/z/8ao1K7oEM
https://godbolt.org/z/EePYbaeGn
Donnerstag
https://godbolt.org/z/Wd57v48ze (publisher(subscriber)
https://godbolt.org/z/WK1vETfv1 (prepared intro)
https://godbolt.org/z/hTd47ozae (concepts playground)
https://godbolt.org/z/Wd57v48ze ????
https://godbolt.org/z/nGPffb734
Link zu meiner Sammlung von Schulungsunterlagen: https://tbfe.de/wetrain/G
User mcppf2327 / Passwort C++3w7