2016-05-22 14 views
-9

誰かが "私はshared_ptrを参照して渡すべきですか?"という質問をしました。彼はたくさんのアップフォースを持つこの返事を受け取りました。 https://stackoverflow.com/a/8385731/5543597「shared_ptrを参照渡し」についてこの記事は正しいですか?

は、それは彼が非常に多くのupvotesを持っている理由は、私は思ってしまう、それが本当ならば、彼が言っている:あなたが望むものに依存

を。被告は の所有権を共有する必要がありますか?それからそれはshared_ptrのそれ自身のコピーを必要とします。したがって、値で を渡してください。

関数が単に呼び出し元のオブジェクトにアクセスする必要がある場合は、 に進み、shared_ptrを コピーするオーバーヘッドを避けるために、参照(const)を渡します。

C++のベストプラクティスは、常にオブジェクトの意味を明示的に定義したものです。実際に思考に取って代わるものは普遍的な "常にこれを" にはありません。

共有ポインタを常に値渡しすると、コストが高くなります( は生ポインタよりもコピーにコストがかかります)。 を実行したことがない場合は、最初の の場所に共有ポインタを使用することに意味はありません。

新しい関数またはオブジェクトがpointeeの所有者 の所有権を共有する必要があるときに共有ポインタをコピーします。特にここ

は、オブジェクトの呼び出し先の株式所有すべきか?それからそれはそれ自身の shared_ptrのコピーを必要とします。だから、それを価値によって渡す。

値で渡すことによってshared_ptrのコピーを作成する理由は、参照でき、calleeはshared_ptrのコピーを作成して、受信した参照を使用してデータを保存することができますか?

またはこの:

あなたがそれを行うことはありません場合は、 最初の場所で共有ポインタを使用しても意味がありません。

refractionで関数に渡すと、それはまだ親関数に存在します。かつてそれを保管することを決定した場合、問題なく保管することができます。

これらの記述は正しいですか?

+1

これはちょっとしたメタです。あなたの質問が「あなたはどう思いますか?」と主張する場合は、主に意見を基にしてこれを閉じなければなりません。特定の技術的な質問がありますか?もしそうなら、それをあなたのポストに目立つように入れてください。 –

+0

私の質問は、これらの技術的な記述が正しいかどうかです。 –

+0

「受け取った参照を使ってshared_ptrのコピーを作成する」これはコピーを渡すよりもいくらか高価ですが、時には呼び出し側がコピーを作成する必要がある場合もあります。 –

答えて

2

はい、答えは正しいです。

値で渡すことによってshared_ptrのコピーを作成する理由は、参照と呼び出し可能な場合、受信した参照を使用してshared_ptrのコピーを作成するだけでデータに格納することができます。

これは可能です。しかし、値渡しは、呼び出し先がコピーを作成する可能性のある自己文書化として機能します。また、値渡しは、関数が右辺値で呼び出され、外に移動されるという利点を有する。func(make_shared<T>());

+0

'値渡しは、呼び出し先がコピーを作成する可能性のある自己文書化の役割を果たします。' shared_ptrは、魔法ではなく、他のオブジェクトと変わりません。つまり、オブジェクト(大きなオブジェクトさえ)を渡すと、呼び出し先がコピーを作成する可能性のある自己文書化となります。 –

+0

@JohnLock通常、はい –

関連する問題