引用: C++のためのAPIデザイン by マーティン・レディ (p82からp89あたり)
pimpl(Pointer to Implementation)の利点と欠点
利点
- 結合度の削減 > 依存性を.cppに移動し、結合要素をすべて除去できる
- コンパイル時間の高速化 > APIのインクルード階層が削減できる
- バイナリ互換性の向上 > pimplオブジェクトはシングルポインタ1つのみ > オブジェクトのバイナリ表現を変更せずに、実装に大きな変更を加えることができる
- レイジー割当て > mimplクラスは必要に応じて作成できる > ネットワーク接続などの制限のあるリソースやコストの高いリソースをクラスが割当てる場合に役立つ
欠点
- 作成したオブジェクトごとに追加の実装オブジェクトを割当て > 割当て解除しなくてはいけない
- コンパイラがconstメソッド内のメンバ変数の変更をキャッチしなくなる (メンバ変数がもはや別のオブジェクトに存在するから)