C++ 基礎からマスターまで — 第23回
ビルド、テスト、Sanitizer、プロファイリングでマスター課題を完成させる
本ブログの記事は、講義を目的として作成しています。 内容に誤りが含まれる可能性があるため、対象コンパイラと標準ライブラリの資料も確認してください。
マスター段階とは高度な構文を並べることではなく、要件、寿命、失敗、性能を再現可能な証拠で説明できることです。最終課題では非同期リソースストリーミングを構築します。
Capstone の契約
request → 重複排除 → file read → decode → GPU upload → cache
│ │ │
cancel/error worker pool main-thread 境界
- 同じリソースキーへの同時要求は一つの処理を共有する。
- すべての待機者が cancel したら不要な処理を止める。
- file bytes、decode buffer、GPU object の所有者を明確にする。
- worker 終了後に callback が破棄済み状態へ触れない。
- エラー分類と再試行可能性を保持する。
- 代表 workload で時間、メモリ、allocation 目標を測る。
依存方向を内側へ向ける
include/streaming/ 公開契約、handle、エラー型
src/core/ 状態機械と重複排除
src/io/ file-system adapter
src/decode/ image-decoder adapter
src/gpu/ render-thread adapter
tests/ unit、integration、race test
benchmarks/ 再現可能 workload
Core は graphics API や file system に直接依存せず、小さな interface や制約付き型を受け取ります。テストでは順序を制御できる fake を注入します。
Header 内の inline 関数とテンプレートは全 translation unit で等価な定義を持つ必要があります。公開 object layout や virtual 関数順序の変更は ABI を壊し得るため、shared library 境界には version と rebuild 方針が必要です。
ツールで失敗を再現する
-fsanitize=address,undefined -fno-omit-frame-pointer
-fsanitize=thread
AddressSanitizer は寿命・境界エラー、UndefinedBehaviorSanitizer は複数の undefined behavior、ThreadSanitizer は data race の検出を助けます。ASan と TSan は通常別ビルドで使い、platform 対応も確認します。
必須の失敗テストには空・破損ファイル、cancel と完了の競合、重複要求、worker 終了、allocator 枯渇を含めます。sleep ではなく barrier、fake executor、制御可能 callback で順序を固定します。
Profile で仮説を検証する
CPU、OS、コンパイラと option、入力、command、反復数、生データを記録します。平均だけでなく p50/p95 latency、peak memory、allocation 数、throughput を確認します。
Profile から一つの bottleneck を選び、一度に一要素だけ変更して正確性と資源を再比較します。std::move、custom allocator、lock-free 構造には証拠が必要です。
完了条件
- 所有権と thread affinity を図で説明する。
- 各処理に成功、失敗、cancel、shutdown 経路がある。
- 自動テストと Sanitizer で race と寿命エラーを検査する。
- clean environment から configure、build、test を再現する。
- 前後の数値、却下案、制限を ADR に残す。
C++ のマスターとは言語の全機能を暗記することではありません。型で値と資源の寿命を表現し、並行処理と失敗境界を制御し、コンパイラ、テスト、Sanitizer、profiler の証拠から設計を直し続ける能力です。