因此,我在阅读为新版本的CPP编写的代码时,经常会看到几乎完全使用string_view常量,即使在简单的用例中也是如此。例如:
std::cout<<"Hello world"sv<<std::endl;
这有什么特别的原因吗?很明显这与存储时间无关,因为string_view只 Package 字符串文字。string_view的开销更低吗?谢谢你抽出时间。
wxclj1h51#
所示示例不引入任何显著增益。唯一可能存在差异的情况是在literal中使用零:
std::cout << "zerro \0insde"sv << std::endl; std::cout << "zerro \0insde" << std::endl;
https://godbolt.org/z/54v1a518f
ccrfmcuu2#
创建一个std::string的开销很大,因为它经常涉及到动态分配内存。当创建std::string的开销很大时,使用const char*和长度参数作为替代可能会减少开销,但也会使代码可读性较差,难以使用。std::string_view,在C++17中引入,是一个对字符序列的非拥有的只读引用。它的目的是为函数提供一种方法来获取对类似于std::string的对象的只读引用,而不需要指定确切的类型。在这种情况下使用const std::string&的缺点是它创建了一个std::string对象。std::string_view是一个轻量级对象,它保存了一个指向原始字符串的指针及其长度。由于它不拥有所指向的内存,因此不需要管理内存本身,这使得它比std::string更高效。但是,在某些情况下,它也会有更多的开销。例如,如果std::string_view经常被复制,每次都需要创建新对象,这可能比复制std::string更昂贵。此外,因为它不拥有它所指向的内存,所以它必须确保只要std::string_view在使用,原始字符串就保持有效,这也会增加一些开销。小心,谨慎使用,因为你不拥有它此外,阅读https://quuxplusone.github.io/blog/2021/11/09/pass-string-view-by-value/的文章非常棒
std::string
const char*
std::string_view
const std::string&
2条答案
按热度按时间wxclj1h51#
所示示例不引入任何显著增益。
唯一可能存在差异的情况是在literal中使用零:
https://godbolt.org/z/54v1a518f
ccrfmcuu2#
创建一个
std::string
的开销很大,因为它经常涉及到动态分配内存。当创建std::string
的开销很大时,使用const char*
和长度参数作为替代可能会减少开销,但也会使代码可读性较差,难以使用。std::string_view
,在C++17中引入,是一个对字符序列的非拥有的只读引用。它的目的是为函数提供一种方法来获取对类似于std::string
的对象的只读引用,而不需要指定确切的类型。在这种情况下使用const std::string&
的缺点是它创建了一个std::string
对象。std::string_view
是一个轻量级对象,它保存了一个指向原始字符串的指针及其长度。由于它不拥有所指向的内存,因此不需要管理内存本身,这使得它比std::string
更高效。但是,在某些情况下,它也会有更多的开销。例如,如果std::string_view
经常被复制,每次都需要创建新对象,这可能比复制std::string
更昂贵。此外,因为它不拥有它所指向的内存,所以它必须确保只要
std::string_view
在使用,原始字符串就保持有效,这也会增加一些开销。小心,谨慎使用,因为你不拥有它
此外,阅读https://quuxplusone.github.io/blog/2021/11/09/pass-string-view-by-value/的文章非常棒