将通过引用传递的 const std::string 替换为 std::string_view
Replace const std::string passed by reference, with std::string_view
我有以下方法获取 std::string
作为输入参数。
int func(const std::string &filename);
从它的签名来看,输入类型是通过引用传递的(没有复制)并且不应该被改变(通过 const
前缀)。
它是否等同于使用 std::string_view
而不是,它也用于只读?
int func(std::string_view filename);
如果不是,那么它们在哪些方面不相似(运行时、内存消耗、功能等)
不,它不等价。
在两种情况下,使用 std::string const&
是更好的选择。
您正在调用需要以空字符结尾的字符串的 C 函数。 std::string_view
有一个 data()
函数,但它可能不是空终止的。在那种情况下,收到 std::string const&
是个好主意。
您需要将字符串保存在某处,或者您正在调用需要 std::string const&
的 C++ 函数。有时它们是库中的函数,不需要更改。
所有其他情况使用 std::string_view
会更好
字符串视图和字符串引用之间也存在一些关键差异。
首先,您是按引用传递,而不是按值传递。编译器每次要访问容量、大小或数据时都必须引用它。
其次,字符串视图不使用容量,只使用大小和数据。这也意味着可以省略加载,因为您是按值传递它,作为具有有限范围的局部变量。
我有以下方法获取 std::string
作为输入参数。
int func(const std::string &filename);
从它的签名来看,输入类型是通过引用传递的(没有复制)并且不应该被改变(通过 const
前缀)。
它是否等同于使用 std::string_view
而不是,它也用于只读?
int func(std::string_view filename);
如果不是,那么它们在哪些方面不相似(运行时、内存消耗、功能等)
不,它不等价。
在两种情况下,使用 std::string const&
是更好的选择。
您正在调用需要以空字符结尾的字符串的 C 函数。
std::string_view
有一个data()
函数,但它可能不是空终止的。在那种情况下,收到std::string const&
是个好主意。您需要将字符串保存在某处,或者您正在调用需要
std::string const&
的 C++ 函数。有时它们是库中的函数,不需要更改。
所有其他情况使用 std::string_view
字符串视图和字符串引用之间也存在一些关键差异。
首先,您是按引用传递,而不是按值传递。编译器每次要访问容量、大小或数据时都必须引用它。
其次,字符串视图不使用容量,只使用大小和数据。这也意味着可以省略加载,因为您是按值传递它,作为具有有限范围的局部变量。