C++17新特性 std::string_view

这篇文章讲解的很详细:

[译]C++17,使用 string_view 来避免复制_tkokof1的专栏-CSDN博客_string_view

主要有三个新的知识点:

1. string 类型只有在字符串超过指定大小(具体实现相关)时才会申请(堆)内存,对于 MSVC 来说,指定大小为 15, 对于 GCC 和 Clang,这个值则为 23.

2.如果只想访问(而不修改)他们时,使用 std::string_view 可以避免字符串数据的复制,从而提高程序效率。

比如定义函数 A(const string &str) 可以改成 A( std::string_view str);

3.非常大的差别: td::string::substr 和 std::string_view::substr 的算法复杂度. std::string::substr 是线性复杂度(依赖于字符串长度), std::string_view::substr 则是常数复杂度(不依赖于字符串长度).最后的结论就是: std::string_view::substr 的性能要大幅优于 std::string::substr.

string_view解决了一些痛点,但同时也引入了指针和引用的一些老问题。C++标准并没有对这个类型做太多的约束,这引来的问题是我们可以像平常的变量一样以多种方式使用它,如,可以传参,可以作为函数返回值,可以做普遍变量,甚至我们可以放到容器里。随着使用场景的复杂,人工是很难保证指向的内容的生命周期足够长。所以,推荐的使用方式:仅仅作为函数参数因为如果该参数仅仅在函数体内使用而不传递出去,这样使用是安全的

你可能感兴趣的:(C++经验,c++)