2010-12-10 2 views
0

さて、私は値について読んできましたが、彼らは素晴らしいアイデアのように思えますが、何かが私を悩ませています。特に、移動するという主張は、私たちがリソースを盗んでコピーを避けることを可能にします。rvalues C++ 0xとヒープに移動

私は移動が動作し、スタック上で起こったすべてのものをコピーしないことを理解していますが、最終的にはスタック上で行われた処理のほとんどがヒープにコピーしたいと思う値をもたらします動かす

struct Foo 
{ 
int x; 
}; 

void doIt() 
{ 
Foo* f = new Foo(); 
f->x = (2 + 4); 
} 

したがって、この例では、(+ 4 2)から得られた右辺値はおそらく代わり> X F-ために上に移動させることができる:intは次のコードを与え、移動代入演算子を持っていると仮定すると

コピーされた大丈夫ですしかしfとf-> xはヒープにあり、その値はスタックにあります。コピーを避けることは不可能に思えます。あなたは単純にf-> xをrvalueのメモリに向けることはできません。その価値は終わるとすぐに吹き飛ばされるでしょう。コピーが必要なようです。

コピーが作成されるのは間違いありませんか? または間違っていますか? または私は完全にrvalueの概念を誤解しましたか?

+1

あなたは何かを誤解しているようです。移動は魔法ではなく、割り当て/コピーするよりもint値を取得する早い方法はありません。 – UncleBens

+0

@UncleBensまあ、私はそれを確認しようとしています。私は読み値を維持して物事をより速くし、コピーを避ける。しかし、私の例のように、私は確かにコピーが必要であり、rvaluesはある特定のケースでのみ役立つことを確認しようとしています。 – anio

+0

スカラー型のオブジェクトの移動は、スカラー型をコピーすることと同じです。より複雑なタイプでは、移動は面白くなります。あなたがそれらを動かすと、正確に何が起こりますかは、クラスデザイナーに任せます。この動作は、独自の移動コンストラクタを定義して制御します。 – sellibitze

答えて

5

この場合、コピーを作成する可能性がありますが、オブジェクトにはintしか含まれていないため、それほど問題にはなりません。

通常、オブジェクトには、オブジェクト自体が割り当てられている場所にかかわらず、ヒープに割り当てられたいくつかのデータへのポインタが含まれている場合があります。この場合、そのデータの新しいコピーの割り当てを避けることは非常に価値があります(オブジェクト自体がスタック上にあってもヒープ上にあるため、オブジェクト自体の場所に関係なく移動できます)。

+0

を参照してください。ポイント。 1つのヒープ場所から別の場所へリソースを盗むためにMoveを使用できます。だから、スタックとスタックの動きを持たせることができます。ヒープとヒープの動き。しかしスタックとヒープの動きはありません。それは私が期待したものです。 – anio

+1

もちろん、オブジェクトをスタックからヒープに移動することができます。移動可能なタイプは、通常、どこに住んでいるか気にしません。ストレージの概念は、セマンティクスを移動するのに直交します。 – sellibitze

1

Um。ローカル変数はスタック上にあります。あなたの値は6に最適化され、結果のバイナリにはmov [dest], 6が含まれています。

3

私の理解では、移動、コピーの反対ではないということです。ほとんどの場合、それは浅いコピー(代わりの深いコピー)を実施しますので、移動が好適です。

オブジェクトがあるリソースへのポインタを保持している場合、浅いコピーがポインタをコピーしていますが、ディープコピーはポインタが指すデータをコピーしています。問題は「どれだけ深く進む必要があるか」です。 int型の浅いまたは深いコピーのようなものは存在しないので、ここでは無関係です:

あなたの例では、唯一のint含まれます。したがって、実際には、動的に割り当てられたリソースが関与する場合にのみ移動が理にかなっていると考えることは正しいです。

+0

移動は確かに浅いコピーに制限されません。移動コンストラクタはクラスデザイナによって異なります。 – sellibitze

関連する問題