std::string_view已经使它成为C++ 17,并且它被广泛推荐使用它代替const std::string&.
其中一个原因是表现.
有人可以解释与用作参数类型相比,究竟 std::string_view是什么/将会更快const std::string&?(假设在被叫方中没有副本)
通过string_view使用C ++ 17,我们得到了一种便宜的方法,该方法将std::string和传递char*给不占用字符串所有权并避免制作临时副本的函数。通过使用std::string按值传递,std::move我们可以为r值和l值引用显式快速地传递字符串所有权。
我的问题是:const std::string&在新的C ++标准中用作任何函数参数有什么好处?
我理解使用std :: string_view的动机;
它可以帮助避免函数参数中的不必要的分配.
例如:
以下程序将从std::string字符串文字创建一个.
这会导致不希望的动态分配,因为我们只对观察字符感兴趣.
#include <iostream>
void* operator new(std::size_t n)
{
std::cout << "[allocating " << n << " bytes]\n";
return malloc(n);
}
void observe_string(std::string const& str){}
int main(){
observe_string("hello world"); //prints [allocating 36 bytes]
}
Run Code Online (Sandbox Code Playgroud)
使用string_view将解决问题:
#include <iostream>
#include <experimental/string_view>
void* operator new(std::size_t n)
{
std::cout << "[allocating " << n << " bytes]\n";
return malloc(n);
}
void observe_string(std::experimental::string_view const& str){
}
int main(){
observe_string("hello world"); //prints nothing
}
Run Code Online (Sandbox Code Playgroud)
这给我留下了一个问题. …
C ++ 17的字符串视图为开发人员提供了一种方法,可以将便宜的非所有者引用传递给实际上比更快const std::string&的字符串。我可能很天真,但这听起来很像Java内置的复制对象引用的机制。像Integer和String这样的内置包装器是不可变的。Java的“引用”机制使您可以保证这些对象在程序的整个生命周期中都具有相同的值。区别在于C ++,string_view在这样的程序中很明显:
void retrieve_an_object (string_view sv) {
}
Run Code Online (Sandbox Code Playgroud)
这比Java令人惊讶的(对C ++开发人员而言)机制更具自我证明性。但是对于标准和库编写者来说,为C ++中每个可能的类编写一个视图类无疑是一个巨大的负担。C ++也许可以有一种更专用的方式将对象标记为“仅查看”,而不必编写整个类;如果这样,为什么将其从考虑中删除?