boost :: make_shared <string>()vs boost :: make_shared <string>(string(“”))</string> </string>

时间:2013-06-13 14:05:02

标签: c++ boost

问题1&gt;第1行的使用是否优于第2行?

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

问题2&gt;一般来说,我们应该总是使用第1行而不是第2行吗?

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

其中Object是具有默认构造函数的类。

2 个答案:

答案 0 :(得分:7)

  

第1行的使用是否优于第2行?

是。第一个说明了它的含义:创建一个共享的,默认构造的字符串。第二个添加一些不必要的噪声(从空字符串文字中创建一个字符串,然后通过复制它来创建另一个字符串),以及可能不必要的运行时开销,以实现相同的效果。

  

一般来说,我们应该始终使用第1行而不是第2行吗?

是。创建一个临时复制和销毁它是没有意义的,而不仅仅是创建你真正想要的对象。

答案 1 :(得分:3)

make_shared会将其所有参数传递给它创建的对象的构造函数。那么将会发生以下情况:

  1. 没有参数,因此make_shared只会调用new string();
  2. 之类的内容
  3. 您创建一个带有参数string的临时"",即一个空字符串。我们称之为tmp。现在make_shared会将其传递给新创建的string,即调用类似new string(tmp)的内容,即总共new string(string(""))。所以你调用string的char const*构造函数,然后是复制构造函数,只是为了创建一个空字符串。矫枉过正,不是吗?