【问题标题】:Where to use std::move for strings?在哪里使用 std::move 字符串?
【发布时间】:2018-05-30 05:02:27
【问题描述】:

我正在阅读这个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)

【问题讨论】:

    标签: c++ c++11 stdmove


    【解决方案1】:

    当可移动类型的值被消耗时,按值接受参数的习惯用法是有意义的。 消费一个价值我的意思是价值被转发到需要它自己的价值副本的东西。这里的原因是这样的:

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

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

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

    因此,简单的规则是

    使用可移动对象时,按值接受参数并移动对象,而不是通过T const&amp; 传递参数并创建副本以使用结果。

    【讨论】:

      【解决方案2】:

      移动字符串时会消耗旧值:

        std::string sa = "Was the string";
        std::string sb = std::move(sa);
        std::cout << "Old [" << sa << "] new [" << sb << "]" << std::endl;
      

      输出: old [] new [是字符串]

      我假设,旧值无需复制即可进入新字符串。当您需要在某些结构中分配字符串字段以作为参数传递时,这应该很有效,例如ROS

        std::string my_message = method_that_returns_just_a_string();
        std_msgs::String message;
        message.data = std::move(my_message);
      

      my_message 现在将包含一些“有效的未指定值”。示例输出包含空字符串,但您不应依赖它。

      不会不必要地克隆 1Mb 的 XML。

      【讨论】:

      • 标准说它在移动后处于有效但未指定的状态。为什么您希望使用 SSO 的字符串在移动后为空?
      • 更正说该字符串实际上是标准的“有效未指定”。
      猜你喜欢
      • 2014-03-02
      • 2013-06-25
      • 2016-02-22
      • 1970-01-01
      • 2022-01-21
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多