【opencv 源码剖析】 四、 Mat的赋值构造函数 和 拷贝构造函数
1.赋值构造函数
右值引用
inline Mat& Mat::operator = (Mat&& m) { if (this == &m) return *this; release(); flags = m.flags; dims = m.dims; rows = m.rows; cols = m.cols; data = m.data; datastart = m.datastart; dataend = m.dataend; datalimit = m.datalimit; allocator = m.allocator; u = m.u; if (step.p != step.buf) // release self step/size { fastFree(step.p); step.p = step.buf; size.p = &rows; } if (m.dims <= 2) // move new step/size info { step[0] = m.step[0]; step[1] = m.step[1]; } else { CV_DbgAssert(m.step.p != m.step.buf); step.p = m.step.p; size.p = m.size.p; m.step.p = m.step.buf; m.size.p = &m.rows; } m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0; m.data = NULL; m.datastart = NULL; m.dataend = NULL; m.datalimit = NULL; m.allocator = NULL; m.u = NULL; return *this; }
左值引用
m.u store data
m store u cols rows and so on.
inline
Mat& Mat::operator = (const Mat& m)
{
if( this != &m )
{
if( m.u )
CV_XADD(&m.u->refcount, 1);
release();
flags = m.flags;
if( dims <= 2 && m.dims <= 2 )
{
dims = m.dims;
rows = m.rows;
cols = m.cols;
step[0] = m.step[0];
step[1] = m.step[1];
}
else
copySize(m);
data = m.data;
datastart = m.datastart;
dataend = m.dataend;
datalimit = m.datalimit;
allocator = m.allocator;
u = m.u;
}
return *this;
}
2. 拷贝构造函数
右值引用
inline Mat::Mat(Mat&& m) : flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data), datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit), allocator(m.allocator), u(m.u), size(&rows) { if (m.dims <= 2) // move new step/size info { step[0] = m.step[0]; step[1] = m.step[1]; } else { CV_DbgAssert(m.step.p != m.step.buf); step.p = m.step.p; size.p = m.size.p; m.step.p = m.step.buf; m.size.p = &m.rows; } m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0; m.data = NULL; m.datastart = NULL; m.dataend = NULL; m.datalimit = NULL; m.allocator = NULL; m.u = NULL; }
左值引用
inline Mat::Mat(const Mat& m) : flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data), datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit), allocator(m.allocator), u(m.u), size(&rows), step(0) { if( u ) CV_XADD(&u->refcount, 1); if( m.dims <= 2 ) { step[0] = m.step[0]; step[1] = m.step[1]; } else { dims = 0; copySize(m); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】