Joh*_*itb 21 c++ substr rvalue-reference c++11
它只是发生在我身上,我注意到std::string的substr操作可能是右值更有效时,它可以盗取分配的内存*this.
N3225的标准库包含以下成员函数声明 std::string
basic_string substr(size_type pos = 0, size_type n = npos) const;
Run Code Online (Sandbox Code Playgroud)
可以实现substr针对rvalues 优化的实现是否会重载并提供两个版本,其中一个版本可以为rvalue字符串重用缓冲区?
basic_string substr(size_type pos = 0) &&;
basic_string substr(size_type pos, size_type n) const;
Run Code Online (Sandbox Code Playgroud)
我想rvalue版本可以实现如下,*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;
}
Run Code Online (Sandbox Code Playgroud)
这是否在常见的字符串实现上以有效的方式工作,还是会占用过多的内务管理?
首先,实现不能添加窃取源的重载,因为这是可以检测到的:
std::string s="some random string";
std::string s2=std::move(s).substr(5,5);
assert(s=="some random string");
assert(s2=="rando");
Run Code Online (Sandbox Code Playgroud)
如果实现窃取了数据,第一个断言就会失败s,并且 C++0x 措辞本质上禁止写入时复制。
其次,这不一定是一种优化:您必须添加额外的内务处理std::string来处理它是较大字符串的子字符串的情况,这意味着当不再有任何字符串引用时要保留大块大字符串,只是它的一些子字符串。