November 2023
Intermediate to advanced
236 pages
3h 24m
Japanese
「1.3.3 参照カウント」で、参照カウントを用いて共有所有を実現するstd::sync::Arc<T>について説明した。Arc::new関数はBox::newと同様にメモリを新たに確保する。しかしBoxとは異なり、Arcをクローンすると、新しくメモリを確保せずに、元の領域を共有する。この共有されたメモリ領域は、Arcとそのすべてのクローンがドロップされた際にだけドロップされる。
この型の実装に関連して考えなければならないメモリオーダリングは非常に興味深い。本章では、独自のArc<T>を実装することで、理論から実践に重心を移す。まず基本的なバージョンを作成し、次に循環構造をサポートできるようにweakポインタを用いたバージョンを作る。そして最後には、最適化されたバージョンを作る。この最後のバージョンは、標準ライブラリの実装とほぼ同じになる。
最初のバージョンの参照カウントは、1つのメモリ領域を共有するArcオブジェクトの数をカウントするためにAtomicUsizeを1つ使う。まず、このカウンタとTオブジェクトを保持する構造体を定義しよう。
struct ArcData<T> {
ref_count: AtomicUsize,
data: T,
}
この構造体がパブリックでないことに気を付けよう。これは我々のArcの内部実装で外からは見えない。
次に、Arc<T>構造体そのものを考えよう。これは実質的にはArcData<T>オブジェクトへの(共有)ポインタにすぎない。
標準のBoxを使ってヒープ上のArcData<T>を管理するようにして、Box<ArcData<T>>のラッパとして実装したくなるかもしれない。しかし、Box
Read now
Unlock full access