最佳C++移动构造函数实现实践

我试图理解move构造函数的实现。
我们都知道如果需要管理C++类中的资源,我们需要实现五的规则(C++编程)。

微软给了我们一个例子:https://msdn.microsoft.com/en-us/library/dd293665.aspx

这里有一个更好的方法,它使用复制交换来避免代码重复:
动态分配对象数组

//C++11
A(A&src)不例外
:mSize(0)
,mArray(空)
{
//我们可以写src.swap(*这个);
//或(*本)。掉期(src);
(*this)=std::move(src);//根据赋值实现
}

在移动构造函数中,直接:

//我们可以写src.swap(*这个);
//或(*本)。掉期(src);

因为我认为(*this)=std::move(src)有点复杂。因为如果我们无意中写为(*this)=src,它将调用普通赋值操作符而不是移动赋值操作符

除了这个问题,在微软的例子中,他们编写了这样的代码:在move assignment operator中,我们需要检查自我分配吗?有可能吗

//移动赋值运算符。
内存块&运算符=(内存块和其他)
{
标准::cout<<“In运算符=(MemoryBlock&)。长度=”
<<其他._length<“<<标准::endl;
如果(此!=&其他)
{
//释放现有资源。
删除[]_数据;
//将数据指针及其长度从
//源对象。
_数据=其他数据;
_长度=其他长度;
//从源对象释放数据指针,以便
//析构函数不会多次释放内存。
其他。_data=nullptr;
其他。_长度=0;
}
归还*这个;
}

一种方法是实现默认构造函数、复制构造函数和交换函数

然后使用前三个实现move构造函数、copy和move赋值运算符

例如:

结构X
{
X();
X(X常数);
无效掉期(X&)无例外;
X(X&b)
:X()//委托给默认构造函数
{
b、 掉期(*本);
}
//请注意,此操作员同时执行复制和移动分配。
//它通过值接受参数,从而调用相应的(复制或移动)构造函数。
X&运算符=(X b){
b、 掉期(*本);
归还*这个;
}
};

如果您在C++98中使用过这个习惯用法,那么一旦添加了move构造函数,就可以在不编写任何代码的情况下获得move赋值

在某些情况下,这个成语可能不是最有效的。因为复制操作符总是先构造一个临时对象,然后再与其交换。通过手工编码赋值运算符,可以获得更好的性能。如有疑问,请检查优化的部件输出并使用探查器

发表评论