0Pricing
C++ Academy · Lektion

Speicherzuweisung für Coroutine-Frames

Setzen Sie sich mit der Speicherzuweisung und Lebensdauer von Coroutine-Frames auseinander.

Speicherzuweisung für Coroutine-Frames ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Wo der Zustand gespeichert wird

Lokale Variablen in einer Coroutine bleiben über Suspensionen hinweg erhalten. Sie können nicht auf dem Stack liegen, da die Funktion zwischen den Suspensionen zurückkehrt. Stattdessen liegen sie in einem auf dem Heap allokierten Coroutine-Frame.

Was der Frame enthält

Der Frame enthält:

  • Die Parameter der Coroutine
  • Das Promise-Objekt
  • Lokale Variablen, die über Suspensionen hinweg bestehen
  • Funktionszeiger zum Fortsetzen und Zerstören

Kosten der Heap-Allokierung

Jeder Aufruf einer Coroutine allokiert einen Frame. Allokierungen sind nicht kostenlos – bei Coroutines mit hoher Aufruffrequenz ist das relevant. Optimierende Compiler können die Allokierung vermeiden, wenn die Lebensdauer begrenzt ist – dies wird als HALO (Heap Allocation eLision Optimization) bezeichnet.

Wann HALO greift

Der Compiler kann eine Heap-Allokierung vermeiden, wenn:

  • Die Lebensdauer der Coroutine nachweislich begrenzt ist
  • Durch Inlining nachgewiesen werden kann, dass der Frame auf den Stack passt
  • Die Frame-Größe zur Compilezeit feststeht

Benutzerdefinierte Allokatoren

Sie können benutzerdefinierte Allokatoren für Ihre Coroutine-Frames bereitstellen, indem Sie operator new innerhalb des Promise-Typs überladen.

struct promise_type {
    void* operator new(size_t size) {
        return std::malloc(size);
    }
    void operator delete(void* ptr) {
        std::free(ptr);
    }
};

Frame-Pools

Allokieren Sie bei asynchronen Systemen mit hohem Durchsatz Frames aus einem Pool, um den Overhead des allgemeinen Allokators zu vermeiden. Jeder Thread- oder Task-Typ kann seinen eigenen Pool haben.

Frame-Größe

Die Frame-Größe hängt von der größten Menge an Variablen ab, die an einem beliebigen Suspensionspunkt noch aktiv sein können. Das Hinzufügen weiterer lokaler Variablen vergrößert sie.

Frame-Größe reduzieren

Tipps:

  • Beschränken Sie den Gültigkeitsbereich von Variablen so weit wie möglich
  • Vermeiden Sie große lokale Arrays – verwenden Sie stattdessen explizit den Heap
  • Verschieben Sie temporäre Variablen in separate Hilfsfunktionen, die keine Coroutines sind

Frames untersuchen

Compiler können Frame-Größen ausgeben. Verwenden Sie bei clang -fcoro-aligned-allocation und untersuchen Sie die Ergebnisse über die Diagnoseoptionen. Eine Disassemblierung zeigt das Layout des Frames.

Lebensdauer und Bereinigung

Der Coroutine-Frame wird zerstört, wenn final_suspend abgeschlossen ist (oder früher, wenn er explizit zerstört wird). RAII-Mitglieder werden ordnungsgemäß zerstört.

Speichersicherheit

Ein Coroutine-Handle ist ein Raw Pointer. Wenn Sie ihn nach der Zerstörung der Coroutine weiterverwenden, führt das zu undefiniertem Verhalten. Bibliothekstypen kapseln Handles in RAII, um dies zu verhindern.

Wann Sie sich Gedanken machen sollten

Bei den meisten Anwendungen müssen Sie sich nicht mit der Frame-Allokierung befassen. Relevant wird sie erst bei Millionen von Coroutines oder extremen Performance-Anforderungen. Erstellen Sie zuerst ein Profil.

Schnelltest

Warum liegt ein Coroutine-Frame typischerweise auf dem Heap?

Zusammenfassung

Coroutines allokieren einen Frame auf dem Heap, um den Zustand über Suspensionen hinweg zu bewahren. Compiler können die Allokierung unter geeigneten Bedingungen vermeiden (HALO). Benutzerdefinierte Allokatoren und Frame-Pools helfen in Systemen mit hohem Durchsatz – bei den meisten Programmen müssen Sie sich darüber keine Gedanken machen.

Häufig gestellte Fragen

Ist die Lektion „Speicherzuweisung für Coroutine-Frames“ kostenlos?

Ja — der vollständige Text von „Speicherzuweisung für Coroutine-Frames“ 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 „Speicherzuweisung für Coroutine-Frames“?

Setzen Sie sich mit der Speicherzuweisung und Lebensdauer von Coroutine-Frames auseinander. 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 4 von 4.

Wie lange dauert die Lektion „Speicherzuweisung für Coroutine-Frames“?

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. Coroutine-Konzepte: co_await, co_yield, co_return
  2. Einen einfachen Generator implementieren
  3. Asynchrone Aufgaben und Awaiter-Typen
  4. Speicherzuweisung für Coroutine-Frames
← Zurück zu C++ Academy