提问人:dpardo 提问时间:11/8/2023 最后编辑:TylerHdpardo 更新时间:11/8/2023 访问量:92
返回字符串时传递string_view
Passing string_view when returning string
问:
我一直在阅读使用 的好处,以及为什么应该在参数列表中使用它。而且我知道通常不建议返回 a。std::string_view
string_view
但是,假设我有一个简单的函数,它接受添加后缀。我能想到两种方法:string
std::string AddSuffix(std::string_view inputString)
{
return std::string(inputString) + "!";
}
或
std::string AddSuffix(std::string inputString)
{
return inputString + "!";
}
如果我必须复制任何一种方式,是否有任何理由使用一种而不是另一种?inputString
答:
0赞
Daniel Langr
11/8/2023
#1
这两个变体的问题在于它们创建了 2 个对象,这两个对象都需要分配内存(如果这些字符串足够长而无法放入 SSO 缓冲区)。这里的原因是(按值)返回一个新对象。std::string
operator+
string
如果要保存一个分配,可以按如下方式修改大小写:std::string_view
std::string AddSuffix(std::string_view inputString)
{
std::string temp;
temp.reserve(inputString.size() + 1);
temp = inputString;
temp += "!";
return temp;
}
在这种情况下,应用 RVO 时只需要一个分配(所有主要实现都将应用它)。
现场演示显示分配:https://godbolt.org/z/44P37qhP3。
评论
1赞
phuclv
11/8/2023
temp += "!";
比temp.push_back('!');
0赞
Daniel Langr
11/8/2023
@phuclv 你能解释一下为什么吗?
0赞
phuclv
11/8/2023
因为它需要 Or 扫描字符串中的 null 终止符以追加,所以复制所有字符直到该点,一些错误的实现甚至可能从中创建新的 std::string 并追加。OTOH ,或者如果需要,只需增加大小,然后在末尾写一个字符std::string::operator+=(char*)
std::string::append(char*)
std::string::push_back(char)
operator+=(char)
std::string::append(char)
评论
return {};
std::string
inputString
string_view
std::string
std::move(inputString) + "!"
std::string_view
std::format
"!"
std::string