在不带指针的Qt中移动语义



我有一个Qt项目,那里有一个Object,它将被复制很多时间。因此,我想添加移动语义。

#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. 可以重置QString的类似string.clear((;为垃圾收集器标记
  3. 如何重置QColor对象

当然可以添加移动语义,但在您的情况下根本不需要这样做。通过复制来移动五分之一、五分之一32、五分之十六。QColor是围绕并集的包装器,没有移动构造函数(不需要(,也将通过复制来移动。QString是QT中的引用计数类型。在最新版本的库中,它有move构造函数,但速度上的差异将是最小的(交换指针和递增引用计数器之间的差异(。

您正在寻找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. 移动非指针是有意义的。你正在制作这样一个物体。移动整数没有帮助,但也没有坏处,所以为了一致性,你也可以这样做。移动没有移动构造函数的东西也可以:如果没有可用的移动构造函数,则使用复制构造函数(移动并不总是更好,但也不会更糟(。

    上面的实现说">通过复制int并移动name_colorBody来移动"。

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

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

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

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

另请阅读移动语义是什么?

相关内容

  • 没有找到相关文章

最新更新