【问题标题】:Move semantics in Qt without pointers?在没有指针的情况下在 Qt 中移动语义?
【发布时间】:2015-08-04 10:42:36
【问题描述】:

我有一个 Qt 项目,我有一个对象,它会被复制很多时间。因此,我想添加移动语义。

#ifndef OBJECTTOCOPY_H
#define OBJECTTOCOPY_H

#include <QColor>
#include <QString>
#include <QDataStream>
namespace level_1     {
namespace level_2 {
class ObjectToCopy {
public:

  explicit ObjectToCopy(const QString& _name = "", const QColor& colorBody = QColor() );

  // MOVE
  ObjectToCopy(ObjectToCopy && other);  

  static quint32 _valueInt32;
  static quint16 _valueInt16;
  QString _name;
  QColor  _colorBody;

private:
};
}
}
#endif // OBJECTTOCOPY_H

如何窃取成员变量的指针,因为它们不是指针?

ObjectToCopy::ObjectToCopy (ObjectToCopy&& other)
    : _valueInt32( other._valueInt32  )
    , _valueInt16( other._valueInt16 )
    , _name( other._name )
    , _colorBody( other._colorBody )
{
    other._valueInt32 = 0;
    other._valueInt16 = 0;
    other.name.clear();
    other._colorBody = QColor();    
}
  1. 这对非指针有意义吗?
  2. 可以像 string.clear() 那样重置 QString 吗?为垃圾收集器标记它?
  3. 如何重置 QColor 对象?

【问题讨论】:

    标签: qt c++11 qt5 move move-semantics


    【解决方案1】:

    您当然可以添加移动语义,但在您的情况下,根本不需要这样做。 quint32、quint16 通过复制移动。 QColor 是 union 的包装器,没有移动构造函数(也不需要),也可以通过复制移动。 QString 是 QT 中的引用计数类型。它在最近版本的库中具有移动构造函数,但速度差异将很小(交换指针和递增引用计数器之间的差异)。

    【讨论】:

      【解决方案2】:

      您正在寻找std::move:

      ObjectToCopy::ObjectToCopy (ObjectToCopy&& other)
          : _valueInt32( other._valueInt32  )
          , _valueInt16( other._valueInt16 )
          , _name( std::move(other._name) )
          , _colorBody( std::move(other._colorBody) )
      {
          other._valueInt32 = 0;            //probably not necessary
          other._valueInt16 = 0;            //probably not necessary
          //other.name.clear();             //not necessary
          //other._colorBody = nullptr;     //not necessary
      }
      
      1. 移动非指针是有意义的。你正在制作这样一个对象。移动整数没有帮助,但也没有伤害,所以你也可以这样做以保持一致性。移动没有移动构造函数的东西也可以:如果没有移动构造函数可用,则使用复制构造函数(移动并不总是更好,但也不会更糟)。

        上面的实现说“通过复制ints并移动name_colorBody来移动”。

        确保您没有从 moved 的变量中读取数据。

      2. 没关系,但没必要。 other 应该是一个临时的,无论如何都会被销毁。 (在你的意义上,C++ 没有垃圾收集器)

        同样,一旦一个对象是moved,它就会像QString一样处于cleared 状态,但情况并非总是如此。

      3. 你真的不能。您可以分配一个默认构造的,例如other._colorBody = QColor();,但这只是意味着它将颜色设置为黑色。 QColor 不能为空,它总是有颜色的。

      另请阅读What are move semantics?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多