我理解使用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]
}
使用 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
}
这使我有一个问题。在函数参数中,何时会选择使用const& std::string而不是string_view?
看着
std::string_view
的接口,好像我可以将所有传递了const&
的std::string
实例替换掉。这方面是否有任何反例呢?std::string_view
是否旨在取代用于参数传递的std::string const&
?
ifstream
的构造函数或者operator+
(参见这个问题),那么最好将其作为const string &
传递。(我想这只是说“当你真正需要一个string
时”的一种复杂的方式。) - Chris Hartman