8

しばらくしてから、C++ では値の意味論が非常に重要であるということをよく耳にします (つまり、 herehere )。とにかく関数の本体内の値をコピーする場合は特に、これを使用する必要があることを知っています。したがって、そのような使用法は公正であると思います。

void foo(std::string txt) { my_container.emplace_back(move(txt)); }

ただし、大きなプロジェクトで時々発生する大きな関数ツリーを介してその引数を渡す必要がある場合の推奨事項は見つかりませんでした。たとえば、次のようになります。

void bar(std::string txt) { foo(move(txt)); /* more actions */ }
void boo(std::string txt) { bar(move(txt)); /* more actions */ }

そのような場合、誰かが何をすべきかをお勧めできますか? 値のセマンティクスにとどまり、コンパイラ オプティマイザーが移動操作の数を制限したり、あらゆる場所で const 参照を使用したり、最後に 1 つのコピーしか使用したりできないことを期待する必要がありますか? それとも、C++ の多くの場合と同様に、依存します (つまり、特定の型のコピーと移動のコスト)? :-)

4

2 に答える 2

0

テンプレートおよびテンプレートに似たソリューションの場合、明らかに完全な転送を使用する必要があります。他の場合では、宣言によるコピーの強制は無駄にfoo(MyType copy)思えます。コストを回避し、必要に応じてコピーします。たとえ copy-elision を使用すると、コンパイラが移動操作よりも少し効率的である可能性があります。

于 2013-08-11T17:11:54.203 に答える