0Pricing
C++ Academy · レッスン

コルーチンフレームの割り当て

コルーチンフレームの割り当てと寿命について考えます。

「コルーチンフレームの割り当て」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

状態が存在する場所

コルーチン内のローカル変数は、中断をまたいで存続します。中断中に関数は戻るため、スタック上に置くことはできません。代わりに、ヒープ上に確保されたコルーチンフレームに置かれます。

フレームの内容

フレームには次のものが格納されます。

  • コルーチンのパラメーター
  • promiseオブジェクト
  • 中断をまたいで存続するローカル変数
  • 再開関数と破棄関数へのポインター

ヒープ確保のコスト

コルーチンを呼び出すたびにフレームが確保されます。確保にはコストがかかるため、高頻度で実行されるコルーチンでは重要な問題になります。最適化コンパイラーは、ライフタイムが限定されている場合に確保を省略できることがあります。これはHALO(Heap Allocation eLision Optimization)と呼ばれます。

HALOが適用される場合

次の条件を満たす場合、コンパイラーはヒープ確保を回避することがあります。

  • コルーチンのライフタイムが、確実に一定の範囲内に収まる
  • インライン化によって、フレームがスタックに収まることを証明できる
  • フレームのサイズがコンパイル時に固定されている

カスタムアロケーター

promise型の内部でoperator newをオーバーロードすると、コルーチンフレームにカスタムアロケーターを指定できます。

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

フレームプール

高スループットの非同期システムでは、一般的なアロケーターのオーバーヘッドを避けるため、フレームをプールから確保します。スレッドごと、またはタスクの種類ごとに独自のプールを用意できます。

フレームのサイズ

フレームのサイズは、どの中断点でも存続する可能性がある変数の集合のうち、最も大きいものによって決まります。ローカル変数を追加すると、フレームのサイズは大きくなります。

フレームサイズを小さくする

ヒント:

  • 変数のスコープをできるだけ狭くする
  • 大きなローカル配列を避け、明示的にヒープを使う
  • 一時オブジェクトを別の非コルーチンヘルパーに移す

フレームの調査

コンパイラーではフレームサイズを出力できます。clangでは-fcoro-aligned-allocationを使用し、診断オプションで確認します。逆アセンブル結果からフレームのレイアウトを確認できます。

ライフタイムとクリーンアップ

final_suspendが完了するとコルーチンフレームは破棄されます(明示的に破棄した場合はそれより早く破棄されます)。RAIIメンバーも正しくデストラクトされます。

メモリー安全性

コルーチンハンドルは生ポインターです。コルーチンが破棄された後もハンドルを保持していると、未定義動作になります。ライブラリーの型はハンドルをRAIIでラップし、これを防ぎます。

注意が必要な場合

ほとんどのアプリケーションでは、フレームの確保について考える必要はありません。数百万個のコルーチンを使う場合や、極めて厳しい性能要件がある場合にだけ注意してください。まずプロファイリングを行います。

理解度チェック

コルーチンフレームが通常ヒープ上に置かれるのはなぜですか。

まとめ

コルーチンは、中断をまたいで状態を保持するためにヒープフレームを確保します。可能な場合、コンパイラーは確保を省略できます(HALO)。カスタムアロケーターやフレームプールは高スループットのシステムで役立ちますが、ほとんどのコードでは気にする必要はありません。

よくある質問

「コルーチンフレームの割り当て」レッスンは無料ですか?

はい。「コルーチンフレームの割り当て」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「コルーチンフレームの割り当て」で何を学びますか?

コルーチンフレームの割り当てと寿命について考えます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「コルーチンフレームの割り当て」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コルーチンの概念:co_await、co_yield、co_return
  2. シンプルなジェネレーターの実装
  3. 非同期タスクとawaiter型
  4. コルーチンフレームの割り当て
← C++ Academyに戻る