【发布时间】:2011-06-28 16:34:37
【问题描述】:
我突然想到,当std::string 的substr 操作可以从*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设置为move-from状态。
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;
}
这对常见的字符串实现是否有效,还是需要太多的内务处理?
【问题讨论】:
-
不会泄露内存吗?毕竟,我们只是窃取了一部分内存,而不是整个区块……
-
请注意,Java 等其他语言中的字符串会这样做 - 一些问题包括,如果您分配一个大字符串,从中提取一个小的子字符串,然后释放大的字符串,您仍然得到只要您使用子字符串,大字符串的数据就会挂在内存中。
-
这基本上是子字符串的写时复制,不是吗?
-
我认为这可能需要太多的内务处理才值得。除了其他问题,它似乎不太适合短字符串优化;在获取已经“短”字符串的子字符串时,您可能必须禁用它。
-
我对委员会正在讨论的这件事有微弱的记忆,但我找不到任何文件。这可能只是一次非正式的讨论。我相信供应商可以自行决定添加此优化。
标签: c++ c++11 substr rvalue-reference