Dipl.-Ing. Martin Weitzel, 64380 Roßdorf bei Darmstadt

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"
  • 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

 


Dienstag

Zu Beginn Live-Demo verschiedener C++11 Mechanismen an einem motivierenden Beispiel

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

std::tuple (inkl. "structured binding")

 


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