`substr`是否使用相同的底层内存?

时间:2014-12-04 04:41:41

标签: c++ libstdc++

我听说std::string使用基础参考计数器来避免复制std::string数据。

substr方法是使用此方法还是创建原始std::string的副本?

由于它是特定于实现的,所以我们最初要关注GNU的实现。

1 个答案:

答案 0 :(得分:4)

来自cplusplus.com,string::substr()的参考(重点已添加):

  

生成子字符串

     

返回新构造的字符串对象,其值初始化为此对象的子字符串副本。

     

子字符串是对象的一部分,从字符位置pos开始并跨越len个字符(或直到字符串的结尾,以先到者为准)。

查看GNU的实现显示它使用substring constructor构建一个新字符串:

basic_string (const basic_string& str, size_type pos, size_type len = npos,
          const allocator_type& alloc = allocator_type());
// or string (const string& str, size_t pos, size_t len = npos);
  

子串构造函数

     

复制 str从字符位置pos开始并跨越len个字符(或直至str结尾的部分,如果str过短或lenbasic_string::npos)。


进一步测试GNU的实现,显然复制构造函数确实使用了引用计数,而子串构造函数却没有。