通过引用传递cv :: Mat还是返回?

时间:2017-03-30 08:08:42

标签: c++ opencv return pass-by-reference

我想知道这个功能的哪个版本效率更高:

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应该实现的移动语义(再次,如果我没有错),第二个版本应该不会更贵比第一个。

1 个答案:

答案 0 :(得分:1)

如果copy elision被应用,第二种情况会更有效。

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

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的类型相同时,保证了copy elision。