gpt4 book ai didi

c++ - 在哪里使用 std::move 来处理字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:37 27 4
gpt4 key购买 nike

我正在读这个post .

我找到了以下代码。

我在想:

  • std::move 对字符串有用吗(假设字符串足够长)?

  • 它是否使之前的字符串无效?

  • 我应该在什么地方使用它,在什么地方不应该使用它?

.

class Name
{
public:
Name(std::string firstName, std::string lastName)
: firstName_(std::move(firstName))
, lastName_(std::move(lastName)) {}

void print() const
{
std::cout << lastName_ << ", " << firstName_ << '\n';
}

private:
std::string firstName_;
std::string lastName_;
};

我的技术一直在使用

constructor(const std::string& argument): field(argument)

最佳答案

当可移动类型的值被消耗时,按值接受参数的习惯用法就有意义了。对于消耗一个值,我的意思是该值被转发给需要它自己的值拷贝的东西。原因是这样的:

  • 当参数按值传递时,可以省略拷贝,例如,当参数是不同函数调用的结果时。即使无法省略拷贝,也可以使参数看起来像临时的(例如,使用 std::move(arg))。
  • 由于一个值​​被传递到函数中,即函数已经拥有一个拷贝,这个值可以转发到任何需要的地方。
  • 在最坏的情况下,参数被复制,但由于无论如何都需要一个值,因此也需要从 T const& 参数创建一个拷贝,并且假设额外的移动操作相对便宜。

因此,预计在最坏的情况下可能会有少量的额外工作,但在正常情况下,工作量会大大减少,因为只完成了一个移动操作而不是复制。

对于 std::string,参数比其他可移动类型稍微难一些,因为它的短字符串优化非常普遍:可能需要传输字节,而不是一些指针操作。然而,在实践中,复制短字符串或指针实际上只是一个 memcpy() 可能后跟一个操作,指示移动操作的源不再包含需要释放的字符串。

因此,简单的规则是

When consuming a movable object accept the argument by value and move the object rather than pass the argument via a T const& and create a copy to consume the result.

关于c++ - 在哪里使用 std::move 来处理字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841596/

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