Tre*_*key 19 c++ string stl parameter-passing string-view
我理解使用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)
这给我留下了一个问题.
我什么时候可以通过const而不是string_view为函数参数选择std :: string?
看看界面std::string_view,看起来好像我可以替换std::string传递的所有实例const&.这有什么反例吗?是std::string_view为了替换std::string const&参数传递?
Bar*_*rry 11
当我会选择
std::string用const&,而不是string_view函数参数?
你需要一个以空字符结尾的字符串吗?如果是这样,那么你应该使用std::string const&哪个给你保证.string_view没有 - 它只是一个范围const char.
如果你没有需要一个空终止字符串,你不需要采取数据的所有权,那么你应该使用string_view.如果您确实需要获取数据的所有权,那么可能是string因为价值优于string_view.
接受const std::string&而不是接受的一种可能原因string_view是当您想要存储对字符串对象的引用时,该对象可以在以后更改。
如果您接受并存储 a string_view,则在string重新分配内部缓冲区时它可能会变得无效。
如果您接受并存储对字符串本身的引用,则不会有这个问题,只要该对象还活着(您可能想要删除 r 值引用重载,以避免出现明显的临时问题)。
安德烈·亚历山德雷斯库(Andrei Alexandrescu)曾经说过,“没有工作比有工作更好”。所以你应该在这样的情况下使用const std::string&。因为std::string_view仍然涉及一些工作(复制一对指针和长度)。
当然,const引用可能仍然有复制指针的成本;这几乎相当于std::string_view将要做的事情。但是还有一项额外的工作std::string_view,它也会复制长度。
这是理论上的,但在实践中,首选基准来推断性能