gpt4 book ai didi

c++ - 在这种情况下使用 string_view 会导致不必要的字符串复制吗?

转载 作者:行者123 更新时间:2023-12-01 14:18:18 25 4
gpt4 key购买 nike

我想做的是让我的类(class)在构造过程中接受一个字符串。我读到 string_viewconst string& 的替代品,所以我自然而然地编写了一个这样的构造函数。这允许我接受 C++ 和 C 字符串。

Url::Url(boost::string_view raw_url)
: url_(static_cast<std::string>(raw_url)) {

这里可能存在的问题是,当传递一个右值时,有一个不必要的复制而不是一个移动。是制作另一个采用 string&& 的构造函数的解决方案吗?这里的最佳做法是什么?

最佳答案

注意:我会考虑 std::string_view 来写答案,但是 boost::string_view 应该是相似的。


I read that string_view was a replacement for const string&

了解为什么首先添加 std::string_view 的原因很有用。

const string&有什么问题?

如果您传递一个 std::string 对象并且您不会使用 std::string_view 获得任何东西,那肯定是高效的。但是现在假设您正在传递一个包含大字符串的 char*。在这种情况下,将创建一个临时的 std::string 对象(并且将复制该 char* 引用的整个字符串),以便函数接收到一个 标准::字符串。这就是 std::string_view 大放异彩的时候。如果您将 char*std::string(或任何可以转换为 std::string_view)传递给接受函数std::string_view(按值,无需通过引用接受 std::string_view)然后是新的 std::string_view 对象创建的成本非常低,因为它只是“一个 View ”并且不会复制底层字符串。


但是你的情况不同。由于无论如何您都在复制字符串,因此您的函数应该按值 接受一个字符串并将该字符串移动到函数内部。诸如

Url::Url(std::string raw_url)
: url_(std::move(raw_url)) {

甚至还有一个clang-tidy warning告诉你这个。

优点是,如果您的函数的用户传递一个左值,您将创建一个拷贝(无论如何您都需要它)和一个移动,但如果他们传递一个右值,则没有拷贝,只有一个移动。

关于c++ - 在这种情况下使用 string_view 会导致不必要的字符串复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62073698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com