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

C++ “substr”是否使用相同的底层内存?,c++,libstdc++,C++,Libstdc++,我听说std::string使用底层引用计数器来避免复制std::string数据 substr方法是否使用此选项,还是创建原始std::string的副本 由于它是非常具体的实现,让我们首先关注GNU的实现。来自cplusplus.com的参考资料(重点补充): 生成子串 返回一个新构造的字符串对象,其值初始化为该对象子字符串的副本 子字符串是对象的一部分,从字符位置pos开始,跨越len个字符(或直到字符串末尾,以先到者为准) 纵观GNU的实现,它确实使用以下方法构造了一个新字符串: 子串构

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

substr
方法是否使用此选项,还是创建原始
std::string
的副本

由于它是非常具体的实现,让我们首先关注GNU的实现。

来自cplusplus.com的参考资料(重点补充):

生成子串

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

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

纵观GNU的实现,它确实使用以下方法构造了一个新字符串:

子串构造函数

复制
str
中从字符位置
pos
开始并跨越
len
字符的部分(如果
str
太短或者
len
基本字符串::npos
,则复制到
str
的末尾)



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

另一个问题是-如果使用,当您修改任一字符串时会发生什么?查看返回值,它必须被复制在C++98/03中,引用计数的实现是允许的。从C++11开始,它就不再被允许了(但一些现存的库仍然这样做,包括大多数GNU发行版默认使用的库)。但仍然不确定它是否会使用子字符串作为对相同基础数据的引用。否则,无论我是否在末尾更改abc。@Kelm,如果值是共享的,则使用引用计数器的字符串实现在修改时会进行复制。
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);