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