Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用传递cv::Mat还是返回它?_C++_Opencv_Return_Pass By Reference - Fatal编程技术网

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

C++ 通过引用传递cv::Mat还是返回它?,c++,opencv,return,pass-by-reference,C++,Opencv,Return,Pass By Reference,我想知道这个函数的哪个版本更有效: void myimread (cv::Mat &mat, const std::string &imgname){ mat = imread(imgname); } 或 据我所知,cv::Mat是一种智能指针,并与移动语义相结合,cv::Mat应该实现第二个版本(同样,如果我没有错的话)不会比第一个版本更贵。如果得到应用,第二个版本会更有效 对于第1种情况,用法为: cv::Mat mat; // default c

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

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

据我所知,
cv::Mat
是一种智能指针,并与移动语义相结合,
cv::Mat
应该实现第二个版本(同样,如果我没有错的话)不会比第一个版本更贵。

如果得到应用,第二个版本会更有效

对于第1种情况,用法为:

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的类型相同时,可以保证复制省略。

获得准确答案的唯一方法是基准测试和/或检查生成的程序集。我同意第二种方法不应该比第一种慢。无论如何,第二种方法更清楚它的意图:函数构建的是
cv::Map
。由于没有证据表明性能糟糕,可读性应该优先于早期的低级别优化……是的,cv::Mat类似于智能指针,但与不调用(复制)构造函数的情况相比,调用(复制)构造函数的成本更高。有一些初始化和值设置等,但图像的主要部分,所有像素数据,都不会被复制,因此cv::Mat构造函数通常根本不是瓶颈。从可读性和可用性来看,我推荐第二个版本。也许我会把这个
std::string&
a
const std::string&
;)
cv::Mat mat = myimread(imgname); // mat is constructed by imread(imgname) directly; copy/move operation is omitted