2016-11-02 14 views
2

対unique_ptrを+動きは、我々はこのようなものがあるとしましょう:コンストラクタ依存性注入:shared_ptrを

struct Complex{ 
    Complex(Part1 p1, Part2 p2, Part3 p3) 
} 

Part1 p1; 
Part2 p2; 
Part3 p3; 

しかし渡すコピーは効果的ではないが、私たちは、ポインタを移動する必要があります。質問はComplexp1, p2, p3の本当の所有者であることから、unique_ptrが優れているようで、一見— unique_ptrまたはshared_ptr

を使用するどのようなタイプです。ただし、コピーできないため、std::moveを使用する必要があります。

は、だから私の質問はPartのうちunqiue_ptrを作成し、Complexのコンストラクタでmoveを使用するか、またはbegginingからshared_ptrを作成して、代わりにshared_ptrを使用し、この場合のためのより良い方法は何か—ですか?

+0

※コピーを渡すと効果がないので、ポインタ*に移動する必要があります。または、ComplexとPartを移動可能にしますか? – stijn

+0

複合体 - 単​​なる複雑で長い生命体です。しかし、現時点では、私は "5のルール"を実装する予定はありません。 –

+2

あなたの問題を解決する方法でもないのですか?とにかく:スマートポインタは何らかの所有権を表しますので、答えは簡単です:p1/p2/p3が*共有*されていない場合は、* shared * _ptrを使用しないでください。 – stijn

答えて

9

ベストソリューションは、Partタイプを安価に移動して移動することです。ただし、オプションでない場合は、動的に管理する必要があります。

あなたが言うように、Complexはパーツを所有しているので、std::uniqe_ptr<Part>として受け入れ、これらのポインタをそれ自身に移動する必要があります。 std::unique_ptrを動かすのは安価です:恐らく2つのポインタ割り当てしか必要ありません。

一方、std::shared_ptrを使用し、コピーを作成するためにインクリメント(コピーを作成するため)とデクリメント(オリジナルを破棄するため)が不要です。今日のキャッシュ重いマルチコアプロセッサでは、アトミック操作は確かに安いものではありません。

コードの意図されたセマンティクス(一義的にはstd::unique_ptrで表される固有の所有権)に従うだけで、優れたパフォーマンスが得られます。

+0

2つのポインタの割り当てはなぜですか? – GeorgeAl

+1

@GeorgeAl宛先をポイント先に指定する1つと、ソースをnullにポイントする1つ。さもなければ、ソースのデストラクタはそれが空であることを知らず、pointeeを割り当て解除するでしょう。 – Angew