string_view 文字与字符串文字在简单场景中的优点

Per*_*ual 5 c++ string-view c++17

因此,我正在阅读为较新版本的 CPP 编写的代码,并且经常看到几乎专门使用 string_view 文字,即使在简单的用例中也是如此。

例如:

std::cout<<"Hello world"sv<<std::endl;
Run Code Online (Sandbox Code Playgroud)

这有什么特别的原因吗?这显然与存储持续时间无关,因为 string_view 仅包装字符串文字。string_view 的开销是否较低?

谢谢您的宝贵时间。

Sar*_*yan 2

创建 a 的std::string成本可能很高,因为它通常涉及动态分配内存。当创建 a 的成本std::string是一个问题时,使用const char*和 长度参数作为替代方案可能会降低费用,但也会降低代码的可读性和使用性。

std::string_viewC++17 中引入的 是对字符序列的非拥有、只读引用。其目的是为函数提供一种对类似于 的对象进行只读引用的方法std::string,而无需指定确切的类型。在这种情况下使用 a 的缺点const std::string&是它会创建一个std::string对象。

std::string_view是一个轻量级对象,它保存指向原始字符串及其长度的指针。因为它不拥有它所指向的内存,所以它不需要自己管理内存,这可以使其比std::string. 然而,在某些情况下它也可能会产生更多的开销。例如,如果std::string_view频繁复制 a ,则每次都需要创建一个新对象,这可能比复制 a 更昂贵std::string。

此外,因为它不拥有它指向的内存,所以它必须确保只要std::string_view使用它,原始字符串就保持有效,这也会增加一些开销。

PS 请小心并谨慎使用它,因为它不属于您

另外,非常值得阅读的文章https://quuxplusone.github.io/blog/2021/11/09/pass-string-view-by-value/

  • *“如果频繁复制 std::string_view,则每次都需要创建一个新对象,这可能比复制 std::string 更昂贵”* 我无法想象复制一个对象比复制`更昂贵std::string`。*“必须确保只要使用 std::string_view ,原始字符串就保持有效,这也会增加一些开销”* 这是程序员关心的问题,你指的是什么开销? (6认同)