【问题标题】:Replace const std::string passed by reference, with std::string_view用 std::string_view 替换通过引用传递的 const std::string
【发布时间】:2021-12-29 08:02:45
【问题描述】:

我有以下方法,它将std::string 作为输入参数。

int func(const std::string &filename);

从它的签名来看,输入类型是通过引用传递的(不复制),不应更改(通过const 前缀)。

是否等同于使用std::string_view,它也用于只读?

int func(std::string_view filename);

如果不是,那么它们在哪些方面不相似(运行时、内存消耗、功能等)

【问题讨论】:

    标签: c++ string noncopyable


    【解决方案1】:

    不,不等价。

    在两种情况下使用std::string const& 是更好的选择。

    1. 您正在调用一个需要以空字符结尾的字符串的 C 函数。 std::string_view 有一个 data() 函数,但它可能不是以空值终止的。在这种情况下,接收std::string const& 是个好主意。

    2. 您需要将字符串保存在某处,或者您正在调用需要 std::string const& 的 C++ 函数。有时它们是不希望更改的库中的函数。

    所有其他情况使用std::string_view会更好

    字符串视图和对字符串的引用之间也有一些关键区别。

    首先,您是按引用传递,而不是按值传递。编译器每次要访问容量、大小或数据时都必须引用它。

    其次,字符串视图不使用容量,仅使用大小和数据。这也意味着可以省略加载,因为您将其作为有限范围的局部变量按值传递。

    【讨论】:

    • 如果需要保存字符串,签名应该是std::string(无引用)。您可以将字符串移动到其新存储中。 string_view 的一大优点是它允许调用者在不复制的情况下传递部分字符串。
    • @doron 有时是的,当你每次都在构造一个字符串时,但如果你可能设置一个字符串,则不是。在这种情况下,您需要 std::string const& 并复制。
    • @doron 看我的回答:stackoverflow.com/a/69858529/2104697
    • @GuillaumeRacicot,是否可以在函数定义中为字符串视图提供默认值:即int func(std::string_view filename = "");?我猜不是,虽然这是 const 字符串大小写的一个选项,对吧?
    • @Zohar81 当然,这是字符串视图的选项。但在任何一种情况下,您都应该使用int func(std::string const& filename = {});int func(std::string_view filename = {}); 生成smaller assembly and is faster
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多