関数は、呼び出し元に2つの値を返す必要があります。実装する最良の方法は何ですか?std :: pairを返すとRVOが発生しますか?
オプション1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
オプション1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
オプション2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
私はオプション2を知っているが、何のコピー/移動はありませんが、それは醜いです。 Option1,1.1に何らかのコピー/移動がありますか? UとVは両方のコピー/移動操作をサポートする巨大なオブジェクトであると仮定します。
Q:標準的なRVO/NRVOの最適化は理論的に可能ですか?はいの場合、gccやその他のコンパイラはまだ実装されていますか?
RVO/NRVOを禁止する 'std :: pair'については何も知りません。一般に、コピーがいつ発生するかを示すコピーコンストラクタを含めることで、テストするのはかなり簡単です。 –
g ++はペアのコピーを防止するRVOを実装していますが、ペアにはuとvのコピーがあります。 –
私はいくつかのテストを実行しました.g ++では、どちらが高速化されたかは、インライン化が可能であることと、UとVのコピーコンストラクタの複雑さに大きく依存することがわかりました。パフォーマンスを探しているなら、どちらが最速かを判断するためにプロファイルする必要があります。 –