C ++(暗黙的または明示的)値コンストラクターは、引数のコピーをオブジェクトに格納する必要がある場合、値またはconstへの参照によってパラメーターを受け入れる必要がありますか?
これが私が考えることができる最短の例です:
struct foo {
bar _b;
foo(bar [const&] b) // pass by value or reference-to-const?
: _b(b) { }
};
ここでの考え方は、fooオブジェクトが作成されるさまざまな方法のいずれかで、fooオブジェクトが作成されるときにbarのコピーコンストラクターの呼び出しを最小限に抑えたいということです。
私はコピーの省略と(名前付き)戻り値の最適化について少し知っていて、「スピードが欲しいですか?値を渡す」を読んだことに注意してください。ただし、この記事ではこのユースケースを直接扱っているとは思いません。
編集:私はより具体的にする必要があります。
、または基本的な組み込み型であるsizeof(bar)
かどうかがわからないとします(テンプレートパラメータの場合もあれば、クラスではなくクラステンプレートの場合もあります)。また、'コンストラクターをインライン化できる(または、さらに言えば's )ことができると思い込まないでください。少なくとも、RVOを実装するコンパイラを使用している可能性があると想定してください。bar
bar
foo
foo
bar
私が望んでいるのは、このような呼び出しが(初期化リストで実行しbar
ている場合でも)コピーコンストラクターへの呼び出しをまったく呼び出さない可能性があることです(コンパイラーの最適化が与えられた場合)。_b(b)
foo
foo f = function_that_creates_and_returns_a_bar_object_using_rvo();
foo
(C ++ 98標準を前提として)これを実行できる可能性はありますか?その場合、値ではなく参照から定数へのパラメーターを受け入れると、多かれ少なかれ機能する可能性がありますか?