0Pricing
C++ Academy · Lektion

Cachefreundliche Datenlayouts

Entwerfen Sie Strukturen aus Arrays und packen Sie Daten für eine gute Cache-Lokalität.

Cachefreundliche Datenlayouts ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Die Speicherhierarchie

CPUs verfügen über mehrere Cache-Ebenen (L1, L2, L3), die deutlich schneller sind als der Hauptspeicher. Cache-freundlicher Code hält häufig benötigte Daten nahe an der CPU.

Cache-Zeilen

Speicher wird in Cache-Zeilen abgerufen – typischerweise 64 Byte groß. Beim Lesen eines Bytes wird die gesamte Zeile geladen. Nutzen Sie das zu Ihrem Vorteil.

Referenzlokalität

Zwei wichtige Eigenschaften:

  • Räumliche Lokalität – baldige Verwendung benachbarter Speicherbereiche
  • Temporale Lokalität – baldige Wiederverwendung desselben Speicherbereichs

Zusammenhängend vs. verkettet

Vektoren speichern Daten zusammenhängend – ihre Iteration ist Cache-freundlich. Verkettete Listen verteilen den Speicher, sodass bei jedem Schritt der Cache verfehlt wird.

// Cache friendly
std::vector<int> v(1000);
for (auto& x : v) ++x;

// Cache UNfriendly
std::list<int> l(1000);
for (auto& x : l) ++x;

AoS vs. SoA

Zwei Layouts für Arrays von Datensätzen:

  • AoS (Array of Structs) – natürlich, aber bei der Iteration über ein einzelnes Feld werden alle Felder berührt
  • SoA (Struct of Arrays) – besser, wenn die meisten Schleifen nur einige Felder verwenden
// AoS
struct Particle { float x, y, z, vx, vy, vz; };
std::vector<Particle> particles;

// SoA
struct Particles {
    std::vector<float> x, y, z, vx, vy, vz;
};

Struct-Packing

Ordnen Sie Member von der größten zur kleinsten Größe an, um Padding zu minimieren. Tools wie pahole zeigen das tatsächliche Layout.

struct Bad  { char c; double d; char c2; };  // padded
struct Good { double d; char c; char c2; };  // smaller

False Sharing

Wenn zwei Threads in verschiedene Variablen derselben Cache-Zeile schreiben, invalidieren sie gegenseitig ihre Caches. Das ist für die Performance verheerend. Fügen Sie Padding bis auf 64 Byte hinzu.

struct alignas(64) Counter {
    std::atomic<int> value;
};

Aufteilung in häufig und selten verwendete Daten

Trennen Sie häufig verwendete Daten (Hot Data) von selten verwendeten Daten (Cold Data) und speichern Sie sie in unterschiedlichen Strukturen. Die CPU cached dann nur den häufig verwendeten Teil.

Voraballokierung

Allokieren Sie Vektoren mit reserve vorab, um wiederholte Reallokierungen zu vermeiden. Jede Reallokierung kopiert alle Elemente – das ist teuer und führt zu vielen Cache-Verfehlungen.

Sequentieller Zugriff gewinnt

Lineare Durchläufe durch Arrays sind am schnellsten. Der Hardware-Prefetcher erkennt das Muster und lädt die nächsten Cache-Zeilen automatisch.

Indirektion vermeiden

Zeiger zwingen die CPU, Abhängigkeiten nachzuverfolgen. std::vector<T*> ist beim Durchlaufen langsamer als std::vector<T>. Verwenden Sie Indirektion nur, wenn sie notwendig ist.

Vor der Optimierung ein Profil erstellen

„Cache-freundlich“ ist eine Richtlinie, keine feste Regel. Messen Sie mit Tools wie perf oder VTune, wo Cache-Verfehlungen schaden – und optimieren Sie dann.

Schnelltest

Warum ist die Iteration über einen std::vector typischerweise deutlich schneller als die Iteration über eine gleich große std::list?

Zusammenfassung

Moderne CPUs sind auf Caches angewiesen. Bevorzugen Sie zusammenhängende Container, verwenden Sie SoA für den selektiven Feldzugriff, packen Sie Structs, vermeiden Sie False Sharing und erstellen Sie mit perf oder VTune ein Profil der Cache-Verfehlungen, um Hotspots zu finden.

Häufig gestellte Fragen

Ist die Lektion „Cachefreundliche Datenlayouts“ kostenlos?

Ja — der vollständige Text von „Cachefreundliche Datenlayouts“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Cachefreundliche Datenlayouts“?

Entwerfen Sie Strukturen aus Arrays und packen Sie Daten für eine gute Cache-Lokalität. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Cachefreundliche Datenlayouts“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Cachefreundliche Datenlayouts
  2. Branch Prediction und Hot Loops
  3. Profiling mit perf, VTune und Sanitizern
  4. Microbenchmarking mit Google Benchmark
← Zurück zu C++ Academy