移动语义和 cv::Mat

move semantics and cv::Mat

本文关键字:Mat cv 语义 移动      更新时间:2023-10-16

Opencv 关于cv::Mat的文档似乎表明目前没有移动构造函数,所以像cv::Mat A=std::move(some_other_cv_mat)这样的东西没有多大意义。我目前(和天真的(这个问题的解决方案是从cv::Mat派生一个类,为此我实现了一个移动构造函数,如下所示:

namespace cv
{
//matrix object derived from cv::Mat
class Mvbl_Mat final: public Mat 
{
public:
//constructors
Mvbl_Mat(){};
Mvbl_Mat(int rows, int cols, int type, const Scalar   &s):Mat(rows, cols, type, s){}
//destructor
~Mvbl_Mat(){};
//move constructor
Mvbl_Mat(Mvbl_Mat && other) noexcept
{   
this->data=other.data;
other.data=nullptr;
} 
//move assignment operator
Mvbl_Mat & operator=(Mvbl_Mat && other)
{   
this->data=other.data;
other.data=nullptr;
return *this; 
}   
};
}

虽然这适用于我目前面临的有限问题,但显然存在许多限制,解决方案远非理想。那么,模拟cv::Mat移动语义的最佳方法是什么?

没有必要这样做。cv::Mat的复制构造函数实际上并不复制数据。 它基本上是一个引用,所有对象共享相同的数据。

cv::Mat::Mat(const Mat & m(

这是一个重载成员函数,为方便起见而提供。它与上述函数的区别仅在于它接受的参数。

参数

m(全部或部分(分配给构造矩阵的数组。这些构造函数不会复制任何数据。相反,指向 m 数据或其子数组的标头被构造并与之关联。引用计数器(如果有(将递增。因此,当您修改使用此类构造函数形成的矩阵时,您也修改了 m 的相应元素。如果你想有一个子数组的独立副本,请使用 Mat::clone((

从4.x开始,OpenCV提供了Mat (Mat &&m)Mat & operator= (Mat &&m)

如果您正在处理 4.x 之前的版本,我建议您查看modules/core/include/opencv2/core/mat.inl.hpp中定义的cv::Mat移动构造函数和移动赋值运算符实现,因为它比仅复制.data成员要复杂一些。