2016-08-11 4 views
-5
class myMem{}; 

class Test{ 
public: 
    initMem1(myMem& mInput){/*initialize _mem1*/} 
    initMem2(shared_ptr<myMem> &pmInput){/*initialize _mem2*/} 

    myMem _mem1; 
    shared_ptr<myMem> _mem2; 
}; 

Test myTest; 
myTest() 

したがって、上記のコードでは、メンバーはクラスに属しています。 1つのメンバは値型であり、別のメンバはshared_ptr型です。どのようにして授業のメンバーにとって良いですか?また、メンバを初期化する関数もあります。どちらの方が良いですか?shared_ptrへの参照渡しの利点は、直接参照を渡すことです。

一般的に、shared_ptrへの参照渡しが直接参照渡しの利点は何ですか?

+4

...あなたには 'shared_ptr'が必要ですか? – GManNickG

+3

質問は次のようにする必要があります: "shared_ptr"への参照を渡して、値を直接shared_ptrに渡すことの利点は何ですか?答えは:それはより安いでしょう。 – tkausl

+0

コンパイラには、どちらも異なる種類です。あなたは本当にリンゴとオレンジを比較することはできません。 ** 'Test&' **と** 'shared_ptr &' **は同じ*参照型ではありません。前者を後者から取得するためのパフォーマンスコストは、おそらく単なる間接的なコストです。しかし、後者はもう少し情報を持っています – WhiZTiM

答えて

1

のみ理由があります。そうでない場合は、std::shared_ptrを渡さないでください。

機能がの場合、確かには共有所有権を取得する必要があり、それは値でstd::shared_ptrを受け入れる必要があります。この機能が共有所有権を持つ場合としない場合は、std::shared_ptr&のみを受け入れます。

関数は所有を変更しない場合、リソースはなくstd::shared_ptr参照を渡します。

を参照してください:CppCoreGuidelines:F.7R.30R.34R.35

0

オリジナルのshared_ptrは、関数の途中で(おそらくネストされた呼び出し)内容を変更し、関数がそれに準備されて新しい内容を望む場合です。それは共有したり、リソースの所有権を変更する必要がある可能性がある場合の関数は、引数としてstd::shared_ptr受け入れるべき

1

のは、あなたの関数内を見てみましょう。私たちは、代入演算子、通常のコピーすべてmyMemフィールドの呼び出しを見ることができます

initMem1(myMem& mInput){ _mem1 = mInput; } 

よう initmem1のために、コードは通常見えます。

はinitMem2について、あなたは 'initMem2(のconst shared_ptrの& pmInput)' を使用する必要があります2例

1)

initMem2(shared_ptr<myMem> &pmInput){ 
    _mem2 = pmInput; 
} 

があります。それは良いスタイルです。 高速初期化がここで確認できます。ちょうどリンクがコピーされます。しかし、あなたは所有権を共有します。 pmInputを外部に変更すると、_mem2も変更されます。 コピーcunstructorは必要ありません。どちらのスマートptrsにも一意のオブジェクトが保持されます。

2)

initMem2(const shared_ptr<myMem> &pmInput){ // of course, const 
    _mem2.reset(*pmInput); 
} 

あなたはもともとpmInputからコピーされた新しいコンテンツと新しいのshared_ptrを作成します。 pmInput_mem2を個別に変更することができます。しかし、この新しいshared_ptrとコピーコンストラクタコールに対して、追加の "新規/削除呼び出し"を取得します。