通过引用传递 cv::Mat 或返回它

Passing cv::Mat by reference or return it?

本文关键字:Mat 返回 cv 引用      更新时间:2023-10-16

我想知道这个函数的哪个版本更有效:

void myimread (cv::Mat &mat, const std::string &imgname){
  mat = imread(imgname);
}

cv::Mat myimread (const std::string &imgname){
  return imread(imgname);
}

据我所知,cv::Mat有点像一个聪明的指针,结合cv::Mat应该实现的移动语义(同样,如果我没错的话(,第二个版本应该不会比第一个版本贵。

如果应用了复制省略,则第2种情况会更有效。

对于第一种情况,用法是:

cv::Mat mat;            // default constructed
myimread(mat, imgname); // copy assigned by imread(imgname) inside myimread

对于第二种情况:

cv::Mat mat = myimread(imgname); // mat is constructed by imread(imgname) directly; copy/move operation is omitted

从 C++17 开始,当 return 语句的操作数是 prvalue 并且函数的返回类型与该 prvalue 的类型相同时,可以保证复制省略。