C++の移動セマンティクスの理解に問題があります。メソッドから大きなオブジェクトを返すとします。この操作を効率的にするために、私はラージオブジェクトクラスのための移動コンストラクタを使用します。大きなオブジェクトを取得し、それを処理する別のメソッドに渡すメソッドを呼び出します。移動コンストラクタはどのように機能しますか?
processLargeObject(getLargeObject());
私はラージオブジェクトを作成する方法getLargeObject()
を記述します。新しい演算子を使用せずにオブジェクトを作成した場合、ストレージがスタックに割り当てられていることを理解しています。あらかじめオブジェクトのサイズを知っていて、それを配列で表現すると、この大きなオブジェクトはdouble foo[1000000000];
と定義できます。今すぐ移動コンストラクタ内で、私は
foo = other.foo;
を言うならば、移動したオブジェクトは、まだスタック上に存在し、スタックが拡大すると上書きすることができます。
これは、移動コンストラクタの使用方法であってはなりません。移動コンストラクタは、ヒープ上に存在する移動オブジェクトに対してのみ使用する必要がありますか?
'foo'がdouble型の配列である場合、' foo = other.foo; 'はコンパイルされません。とにかく、どんなに正確な二倍体の配列を動かすことができますか? – Praetorian
これは、配列をループしてコピーを作成する必要があることを意味しますか? – AggieMan
宣言しようとしましたが、その中に普通の配列で10億倍の倍数を持つオブジェクトを使用しましたか?あなたのスタックをあふれさせる良い方法のようです。あなたは 'ベクトル'を使用していて、実際に移動するのが理にかなっているはずです。 –
Praetorian