2

質問1>2号線より1号線の方が使い勝手が良いというのは本当ですか?

boost::shared_ptr<string> shpStr = boost::make_shared<string>(); // Line 1
boost::shared_ptr<string> shpStr = boost::make_shared<string>(string("")); // Line 2

質問 2> 一般的に、2 号線ではなく 1 号線を常に使用する必要があるというのは本当ですか?

boost::shared_ptr<Object> shpStr = boost::make_shared<Object>(); // Line 1
boost::shared_ptr<Object> shpStr = boost::make_shared<Object>(Object()); // Line 2

ここで、Object はデフォルトのコンストラクタを持つクラスです。

4

2 に答える 2

7

1号線の方が2号線よりも使い勝手が良いというのは本当ですか?

はい。1 つ目は、それが何を意味するかを示しています: 共有され、デフォルトで構築された文字列を作成します。2 つ目は、不要なノイズ (空の文字列リテラルから文字列を作成し、それをコピーして別の文字列を作成する) を追加し、不要なランタイム オーバーヘッドを追加して、同じ効果を実現します。

一般に、常に 2 号線ではなく 1 号線を使用する必要があるというのは本当ですか?

はい。実際に必要なオブジェクトを作成するだけでなく、コピーして破棄するためだけに一時オブジェクトを作成しても意味がありません。

于 2013-06-13T14:11:20.713 に答える
3

make_shared作成するオブジェクトのコンストラクターにすべての引数を渡します。したがって、次のようになります。

  1. 引数がないので、make_shared次のようなものを呼び出すだけですnew string();
  2. 一時的なstringwith 引数""、つまり空の文字列を作成します。と呼びましょうtmpmake_sharedこれを新しく作成した に渡します。つまり、 のstringようなものを呼び出します。したがって、空の文字列を作成するためだけに、文字列のコンストラクターを呼び出し、その後にコピー コンストラクターを呼び出します。やり過ぎですね。new string(tmp)new string(string(""))char const*
于 2013-06-13T14:10:15.753 に答える