← SEARCHABLE ARCHIVE
C / C++ · 2026-08-15

C++ von den Grundlagen bis zum Profi — Folge 23

Das Meisterprojekt mit Builds, Tests, Sanitizern und Profiling abschließen

INTERACTIVE READING MODE →

Die Artikel in diesem Blog wurden zu Lehrzwecken verfasst. Sie können Fehler enthalten; prüfen Sie die Aussagen daher mit dem Ziel-Compiler und der verwendeten Standardbibliothek.

Meisterschaft bedeutet nicht möglichst viel fortgeschrittene Syntax, sondern Anforderungen, Lebensdauer, Fehler und Performance reproduzierbar erklären zu können. Das Abschlussprojekt ist ein asynchrones Resource-Streaming-System.

Vertrag des Capstones

request → deduplicate → file read → decode → GPU upload → cache
                 │           │             │
          cancel/error   worker pool   main-thread boundary
  • Gleichzeitige Anfragen desselben Resource Keys teilen eine Operation.
  • Wenn alle Interessenten abbrechen, endet unnötige Arbeit.
  • File Bytes, Decode Buffer und GPU-Objekte haben klare Besitzer.
  • Nach Worker-Shutdown berührt kein Callback zerstörten Zustand.
  • Fehlerkategorie und Wiederholbarkeit bleiben erhalten.
  • Zeit-, Speicher- und Allokationsziele werden mit repräsentativer Last gemessen.

Abhängigkeiten nach innen richten

include/streaming/     öffentliche Verträge, Handles, Fehlertypen
src/core/              Zustandsmaschine und Deduplizierung
src/io/                Dateisystem-Adapter
src/decode/            Bilddecoder-Adapter
src/gpu/               Render-Thread-Adapter
tests/                 Unit-, Integrations- und Race-Tests
benchmarks/            reproduzierbare Workloads

Der Kern hängt nicht direkt von Grafik-API oder Dateisystem ab. Er erhält kleine Interfaces oder eingeschränkte Typen; Tests injizieren deterministische Fakes.

Inline-Funktionen und Templates in Headern brauchen in allen Translation Units äquivalente Definitionen. Änderungen an öffentlichem Layout oder virtueller Funktionsreihenfolge können die ABI brechen. Shared-Library-Grenzen benötigen daher Versionierungs- und Rebuild-Regeln.

Fehler mit Werkzeugen reproduzieren

-fsanitize=address,undefined -fno-omit-frame-pointer
-fsanitize=thread

AddressSanitizer findet viele Lebensdauer- und Grenzfehler, UndefinedBehaviorSanitizer meldet mehrere Arten undefined behavior, ThreadSanitizer hilft bei data races. ASan und TSan laufen gewöhnlich in getrennten Builds; Plattformunterstützung variiert.

Pflichttests umfassen leere und beschädigte Dateien, Rennen zwischen Completion und Cancel, doppelte Requests, Worker-Shutdown und erschöpfte Allocatoren. Barriers, Fake Executors und kontrollierte Callbacks sind zuverlässiger als sleeps.

Profile prüfen Hypothesen

Dokumentieren Sie CPU, OS, Compiler und Optionen, Eingabe, Befehl, Wiederholungen und Rohdaten. Betrachten Sie p50/p95 latency, peak memory, Allokationen und Durchsatz statt nur eines Mittelwerts.

Wählen Sie einen gemessenen Engpass, ändern Sie einen Faktor und vergleichen Sie Korrektheit sowie Ressourcen erneut. std::move, Custom Allocators und lock-free Strukturen brauchen Belege.

Abschlusskriterien

  • Besitz und Thread Affinity als Diagramm erklären.
  • Für jede Arbeit Erfolg, Fehler, Cancel und Shutdown vorsehen.
  • Races und Lebensdauerfehler mit Tests und Sanitizern prüfen.
  • Configure, Build und Test aus sauberer Umgebung reproduzieren.
  • Vorher/Nachher-Werte, verworfene Alternativen und Grenzen in ADRs festhalten.

C++ zu meistern heißt nicht, jede Sprachecke auswendig zu kennen. Es heißt, Lebensdauer in Typen auszudrücken, Grenzen von Nebenläufigkeit und Fehlern zu kontrollieren und das Design anhand von Compilern, Tests, Sanitizern und Profilern fortlaufend zu verbessern.