我突然想到,std::string
的 substr
操作对于右值来说可能更有效,因为它可以从 *这个
。
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/