7

ある種の高価なオブジェクト(固定サイズではないベクトルとマップを含む)を生成する関数があるので、コピーc'torを呼び出さないようにします。

これまで、メソッドからstd :: shared_ptrを返し、それを使用しましたが、これは醜く、typedeffingを実際に使用できるようにする必要があると思います。

私は私を助けるかもしれない2つのことを知っています。最初にコピーの省略であり、2番目は移動セマンティクスです。

私の問題は、どちらも正しく使用する方法を知っていることです。私の調査によると、コピーの省略は完全にコンパイラーによって行われ、標準の一部ではありません。私は本当にこれだけに頼る必要はありません。

では、move assigmentが呼び出され、コンパイラーがコピーの省略を実行できないようにするために、それを適切に配置するにはどうすればよいですか。

ResultSet &&generateResults()
{
    //ResultSet a(); :S
    ResultSet a;
    a.populat(...
    //blah blah blah
    return a;
}

//else where (where the && assignment operator is overloaded
ResultsSet b = generateResults();

この場合、これはこれをコーディングするための最も正しい方法ですか?そうでなければ、どうすればそれを改善できますか。C++0xのみの構成を使用できてうれしいです。

ところで:私のコンパイラはgcc4.6です

4

5 に答える 5

4

あなたの質問に対する良い答えは、デイブ・エイブラハムズによるこのブログ投稿シリーズで見つけることができます:

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

右辺値参照、移動コンストラクター、およびコピーの省略の間の相互作用について説明します。少し長いですが、全部読む価値があります:)

短編小説は、コピーの省略が優先されるということです。何らかの理由で発生しない(または発生しない)場合、コンパイラーは最初に移動コンストラクターを検討し、最後にコピーコンストラクターを検討する必要があります。

于 2011-06-18T16:24:14.637 に答える
4

この場合、これはこれをコーディングするための最も正しい方法ですか?

実際には、これは「最も正しくない」方法です。つまり、自動オブジェクトへの参照を返します。関数が戻ると、クライアントは存在しなくなったオブジェクトへの参照を受け取ります。

この点で、左辺値参照と右辺値参照の間に違いはありません。したがって、右辺値参照を取り除き、結果を値で返すだけです。NRVOを取得するか、セマンティクスを移動します。

于 2011-06-19T00:18:14.167 に答える
3

読むのが好きでない場合は、右辺値と移動セマンティクスに関するビデオへのリンクがあります:http: //channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-テンプレート-ライブラリ-STL-9-of-n

于 2011-06-18T16:26:27.293 に答える
3

あなたの研究は間違っています。コピーの省略は絶対に標準です。義務付けられていませんが、正式に許可されています。あなたの関数の例では、変換は比較的簡単なので、私は間違いなくそれが適用されることを期待します。

そして第二に、右辺値参照を返すのではなく、値で返すだけです。コンパイラーは、コピーを削除することを義務付けられていませんが、おそらくそれでも可能ですが、移動セマンティクスを呼び出す必要があります。

ああ、その特定のコードに対して、ムーブ代入演算子ではなく、ムーブコンストラクターをオーバーロードする必要がありますが、もちろん理想的には両方を実行します。

ResultSet a();

変数を定義しませんが、a何も取得せずにResultSetを返すという関数を宣言します。

于 2011-06-18T16:26:50.007 に答える
0

あなたはmoveコンストラクターについて学ぶことができます、そして私は誰かがあなたのために例を提供すると確信しています。

しかし、あなたが検討するかもしれない別のオプションはですunique_ptr。アプリケーションの場合、shared_ptrと同じように機能するはずであり、はるかに効率的です。(ただし、これらのtypedefが必要な場合もあります。)

于 2011-06-18T16:28:59.240 に答える