通过引用传递 cv::Mat 或 return 吗?
Passing cv::Mat by reference or return it?
我想知道这个函数的哪个版本效率更高:
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
应该实现的移动语义(同样,如果我没记错的话)第二个版本应该不是比第一个贵。
如果应用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 语句的操作数是纯右值并且函数的 return 类型与该纯右值的类型相同时,复制省略是有保证的。
我想知道这个函数的哪个版本效率更高:
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
应该实现的移动语义(同样,如果我没记错的话)第二个版本应该不是比第一个贵。
如果应用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 语句的操作数是纯右值并且函数的 return 类型与该纯右值的类型相同时,复制省略是有保证的。