【发布时间】:2020-03-24 15:24:49
【问题描述】:
我了解使用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
}
这给我留下了一个问题。
我什么时候会选择 std::string by const& 而不是 string_view 作为函数参数?
查看std::string_view 的接口,看起来我可以替换const& 传递的所有std::string 实例。这有什么反例吗? std::string_view 是不是要替换 std::string const& 进行参数传递?
【问题讨论】:
-
我想说:如果函数要将参数隐藏到内部离散的 std::string 中,那么复制构造将比 string-to-string-view-to 便宜-字符串往返。但我意识到 basic_string_view 可以记住它是由一个字符串构造的,并从它的 to_string() 方法返回相同的。
-
@SamVarshavchik:如果您要制作副本,您希望按值接受参数,以便可以复制或移动构造。
-
如果您要将参数传递给只接受字符串的东西,例如
ifstream的构造函数或operator+(请参阅this question),那么您不妨采取它是const string &。 (我想这只是一种复杂的表达方式“当你真的需要string。)
标签: c++ string stl parameter-passing string-view