21

我突然想到std::stringsubstr当它可以从*this.

N3225 的标准库包含以下成员函数声明std::string

basic_string substr(size_type pos = 0, size_type n = npos) const;

可以实现为右值优化的实现是否可以substr重载并提供两个版本,其中一个可以为右值字符串重用缓冲区?

basic_string substr(size_type pos = 0) &&;
basic_string substr(size_type pos, size_type n) const;

我想右值版本可以按如下方式实现,*this将设置的内存重用*this到移动状态。

basic_string substr(size_type pos = 0) && {
  basic_string __r;
  __r.__internal_share_buf(pos, __start + pos, __size - pos);
  __start = 0; // or whatever the 'empty' state is
  return __r;
}

这在常见的字符串实现上是否以有效的方式工作,还是需要太多的内务处理?

4

3 回答 3

4

首先,实现不能添加窃取源代码的重载,因为这是可以检测到的:

std::string s="some random string";
std::string s2=std::move(s).substr(5,5);
assert(s=="some random string"); 
assert(s2=="rando");

如果实现从 窃取数据,第一个断言将失败s,并且 C++0x 措辞本质上禁止写入时复制。

其次,无论如何这不一定是优化:您必须添加额外的内务std::string处理以处理它是较大字符串的子字符串的情况,这意味着当不再有任何字符串引用时保留大块大字符串,只是它的一些子字符串。

于 2011-02-17T16:48:56.917 回答
0

是的,也许应该向标准委员会提出建议,或者在图书馆中实施。我真的不知道优化会有多大价值。这将是一项有趣的研究。

当 gcc 增加对 r-value 的支持时this,应该有人尝试它并报告它的用处。

于 2011-02-17T17:07:35.110 回答
-2

有一些字符串类实现了写时复制。但我不建议在您的项目中添加另一种字符串类型,除非真的有正当理由。

查看Memory-efficient C++ strings(interning、ropes、copy-on-write 等)中的讨论

于 2011-02-17T13:07:39.193 回答