c++ - std::string 可以为右值 *this 重载 "substr"并窃取资源吗?

标签 c++ c++11 substr rvalue-reference

我突然想到,std::stringsubstr 操作对于右值来说可能更有效,因为它可以从 *这个

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

这对常见的字符串实现是否有效,还是需要太多的内务处理?

最佳答案

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

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 中添加额外的内务处理以处理它是较大字符串的子字符串的情况,并且它这意味着当不再有任何字符串引用大字符串时保留大块,只有它的一些子字符串。

关于c++ - std::string 可以为右值 *this 重载 "substr"并窃取资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5022445/

相关文章:

C++ Win32,编辑控件可以是所有者绘制的吗?

c++ - 是否有另一种方法可以防止调用父类(super class)而不是基类方法(例如使用关键字或其他方法)调用派生方法?

c++ - boost 日志 : Why it is showing duplicate the message?

c++ - C++传递参数时 "small object"的定义

类中的 C++ 静态变量

c++ - 如何在另一个函数中访问在一个函数中定义和声明的变量?

c++ - C++ 中具有多个(不相关?)分布的随机生成器

r - 在 SparkR 中的 DataFrame 列上使用 substr()

javascript - Javascript 中replace() 或 substr() 的性能

php - 在 mysql 响应的某些字符后添加点 (.)