PYA*_*PYA 2 c++ string-view c++17
给出以下代码,我们可以看到,std::string_view当字符串增长超出容量时,它就会失效(这里 SSO 最初生效,然后将内容放入堆上)
#include <iostream>
#include <cassert>
#include <string>
using std::cout;
using std::endl;
int main() {
std::string s = "hi";
std::string_view v = s;
cout << v << endl;
s = "this is a long long long string now";
cout << v << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
hi
#
Run Code Online (Sandbox Code Playgroud)
因此,如果我将 string_view 存储到字符串中,然后更改字符串的内容,我可能会遇到大麻烦。鉴于现有的实现,是否有可能std::string变得更智能string_view?哪个不会面临这样的缺点?我们可以存储一个指向字符串对象本身的指针,然后确定该字符串是否更多地处于 SSO 中并相应地工作。(虽然不确定这如何处理文字字符串,所以也许这就是为什么不这样做的原因? )
我知道这string_view类似于存储返回值,string::c_str()但考虑到我们有这个包装器,std::string我认为很多使用此功能的人不会遇到这个问题。大多数免责声明是为了确保所指向的内容std::string在范围内,但这完全是一个不同的问题。
string_view一无所知string。它不是围绕string. 它甚至不知道它作为一种类型std::string 存在;string从到 的转换string_view发生在std::string. string_view与 没有关联或依赖std::string。
事实上,这就是的全部目的string_view:能够拥有一个不可修改大小的字符串,而不知道它是如何分配或管理的。它可以引用任何连续存储其字符的字符串类型,这是事情的重点。它允许您创建一个接口,无需string_view知道或关心调用者是否使用std::string、CString或任何其他字符串类型。
由于拥有字符串的行为与 无关string_view,因此没有可能的机制可以string_view告知它引用的字符串何时不再有效。
我们可以存储一个指向字符串对象本身的指针,然后确定该字符串是否更多地处于 SSO 中并相应地工作。
为了便于讨论,让我们忽略string_view不应该知道或关心其字符是否来自的std::string。让我们假设string_view仅适用于std::string(即使这使得该类型完全毫无价值)。
即便如此,这也是行不通的。或者更确切地说,只有当类型在功能上与std::string const&.
如果string_view存储指向第一个字符的指针和大小,则对 的任何修改都std::string可能会改变它。即使不破坏小字符串优化,它也可以改变大小。它可以改变大小而不引起重新分配。纠正这个问题的唯一方法是string_view始终询问std::string它引用的字符数据和大小是什么。
这与std::string const&直接使用 a 没有什么不同。
| 归档时间: |
|
| 查看次数: |
539 次 |
| 最近记录: |