
304
|
8 章 もう一ひねり
あるとも分かるでしょう(効率低下以外に)。読者が C++ プログラミングで最初に学んだであろう、
ユーザ定義型の値渡しは避けよという規則には充分な理由があるのです。
値渡しに関し、C++11 は基本的に C++98 の叡知を踏襲しています。一般的に言って、値渡しは依
然としてお目にかかりたくない性能低下を発生させ、またスライシング問題を引き起こす場合もあ
ります。しかし、C++11 では左辺値実引数と右辺値実引数を区別するようになりました。コピー可
能な型の右辺値にムーブセマンティクスを使用する関数の実装では、オーバロードかユニヴァーサ
ル参照のいずれかを用いる必要があり、どちらを選択しても犠牲になるものがあります。コピー可
能かつムーブがコスト安な型を、スライシング問題も発生させず常に仮引数をコピーする関数に渡
す場合は特殊ですが、値渡しは参照渡しと比較しても効率性に遜色がなく、それでいて参照渡しが
持つ短所がなく、実装も容易な選択肢となり得ます。
重要ポイント
•
関数内で常にコピーされ、コピー可能かつムーブがコスト安な仮引数は、値を渡しても参照
渡しと同程度の効率性を期待できる。実装も容易であり、オブジェクトコードサイズも小さ
くできる。
•
コンストラクトによる仮引数のコピーは、代入によるコピーよりも大幅にコスト高になる恐
れがある。
•
値渡しはスライシング問題を起こしやすいため、仮引数の型が基底クラスの場合には一般に
不適切である。
項目 42:要素の挿入の代わりに直接配置を検討する ...