メインコンテンツへスキップ

E.A.2 C++ 応用

C++ RAII と所有権マップ

デプロイで出てくる C++ 応用の中心は、ほとんどこの問いです。誰がリソースを所有し、いつ解放するのか。

所有権とインターフェースの例を動かす

advanced.cpp を作成します。

#include <iostream>
#include <memory>

struct Engine {
virtual ~Engine() = default;
virtual float run(float input) = 0;
};

struct CpuEngine : Engine {
float run(float input) override {
return input * 0.84f;
}
};

class Session {
public:
explicit Session(std::unique_ptr<Engine> engine)
: engine_(std::move(engine)) {}

void predict() {
std::cout << "cpu_score=" << engine_->run(1.0f) << "\n";
std::cout << "session_done\n";
}

private:
std::unique_ptr<Engine> engine_;
};

int main() {
Session session(std::make_unique<CpuEngine>());
session.predict();
return 0;
}

実行します。

c++ -std=c++17 advanced.cpp -o advanced
./advanced

期待される出力:

cpu_score=0.84
session_done

注目するところ

C++ の要素デプロイでの意味
Engine インターフェースビジネスコードが CPU/GPU/runtime backend を切り替えられる
std::unique_ptr1 つの所有者だけが engine リソースを管理する
std::move所有権を Session に移す
virtual ~Engine()インターフェース経由でも安全に片付けられる
RAIIリソース寿命がオブジェクト寿命に従う

少し変えてみる

2 つ目の engine を追加します。

struct FastEngine : Engine {
float run(float input) override {
return input * 0.91f;
}
};

それから CpuEngineFastEngine に置き換えます。Session の他のコードは変えないでください。

合格チェック

Session が engine を所有する理由、ここで unique_ptr が raw pointer より安全な理由、インターフェースで runtime backend を差し替えられる理由を説明できれば合格です。