“substr”是否使用相同的底层内存

Does `substr` uses the same underlying memory?

本文关键字:内存 substr 是否      更新时间:2023-10-16

我听说std::string使用底层引用计数器来避免复制std::string数据。

substr方法是否使用它或是否创建原始std::string的副本?

由于它是特定于实现的,因此让我们首先关注GNU的实现。

从 cplusplus.com,string::substr()的参考(强调(:

生成子字符串

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

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

窥视 GNU 的实现表明它确实使用子字符串构造函数构造了一个新字符串:

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);

子字符串构造函数

复制从字符位置开始pos并跨越len字符的str部分(如果str太短或len basic_string::npos,则直到str结束(。


进一步测试 GNU 的实现,显然复制构造函数确实使用引用计数,而子字符串构造函数则不使用。