Spanクラス設計から学ぶ、堅牢なC++クラスの作り方

1. パフォーマンスの最適化:`reserve`の効果

`vector`の「再確保」は高コストな処理です。`reserve`で事前にメモリを確保することが、どれほど効果的かシミュレーションで見てみましょう。

`reserve`なし

再確保回数: 0

`reserve(1000)`あり

再確保回数: 0

2. コードの安全性:`explicit`の役割

`explicit`キーワードは、意図しない暗黙の型変換を防ぎます。コンパイラの気持ちになって、その挙動の違いを確かめてみましょう。

`explicit`なし

void someFunc(Span s);

// 以下のコードは...
someFunc(10);

`explicit`あり

void someFunc(Span s);

// 以下のコードは...
someFunc(10);

3. 例外安全性:Copy-and-Swapイディオム

代入演算子を安全に実装するための強力なテクニックです。`a = b;` を実行した際の、オブジェクト内部のデータの流れをアニメーションで見てみましょう。

Data A

Object 'a'

Data B

Object 'b'

Temp Copy

4. 範囲指定による一括追加

複数の要素を追加する場合、`for`ループで`push_back`を繰り返すより、イテレータ範囲を指定して`insert`する方が効率的です。その速度差を計測してみましょう。

ループで`push_back`

- ms

範囲`insert`

- ms