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

4
我想知道这个函数的哪个版本更高效:
void myimread (cv::Mat &mat, const std::string &imgname){
  mat = imread(imgname);
}

或者

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

据我所知,cv::Mat 有点像智能指针,并且结合了移动语义,这意味着第二个版本的成本不应该比第一个更高(如果我没有记错的话)。


得到准确答案的唯一方法是基准测试和/或检查生成的汇编代码。我同意第二个应该不比第一个慢。 - Vittorio Romeo
无论如何,第二种方法更清楚地表明了其意图:cv::Map是该函数构建的内容。由于没有可怕的性能问题,可读性应优先于早期低级别优化... - Serge Ballesta
1
是的,cv::Mat类似于智能指针,但如果调用(复制)构造函数,则其成本应该更高,与不调用(复制)构造函数的情况相比。有一些初始化和值设置等内容,但图像的主要部分,即所有像素数据,没有被复制,因此cv::Mat构造函数通常根本不是瓶颈。从可读性和可用性方面考虑,我建议使用第二个版本。也许我会将std::string&更改为const std::string& ;) - Micka
1个回答

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开始,当返回语句的操作数是一个prvalue,并且函数的返回类型与该prvalue的类型相同时,复制省略被保证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接