переместить семантику и резюме :: Mat - PullRequest
0 голосов
/ 24 мая 2018

Документация 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?

1 Ответ

0 голосов
/ 24 мая 2018

Нет необходимости делать это.Конструктор копирования cv::Mat на самом деле не копирует данные.Он в основном делает ссылку, и все объекты имеют одни и те же данные.

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

Этоперегруженная функция-член, предоставленная для удобства.Он отличается от вышеуказанной функции только тем, какой аргумент (ы) принимает.

Параметры

m Массив, который (полностью или частично) присваивается построенной матрице.Данные конструкторы не копируются.Вместо этого создается заголовок, указывающий на m данных или его подмассив и связанный с ним.Счетчик ссылок, если есть, увеличивается.Таким образом, когда вы модифицируете матрицу, сформированную с помощью такого конструктора, вы также модифицируете соответствующие элементы m.Если вы хотите иметь независимую копию подмассива, используйте Mat :: clone ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...