我听说std::string
使用基础参考计数器来避免复制std::string
数据。
substr
方法是使用此方法还是创建原始std::string
的副本?
由于它是特定于实现的,所以我们最初要关注GNU的实现。
答案 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
过短或len
为basic_string::npos
)。
进一步测试GNU的实现,显然复制构造函数确实使用了引用计数,而子串构造函数却没有。