• 【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);
        }
    }
  • 相关阅读:
    Hdu 4496 D-City
    Hdu 1213 How Many Tables
    T1387:搭配购买(buy)
    codevs 2597 团伙
    Hdu 1232 畅通工程
    RQNOJ PID331 家族
    提高组day4
    xjoi2018提高组训训练25
    关于upp和lower
    矩阵快速幂求fib
  • 原文地址:https://www.cnblogs.com/luoyinjie/p/9957451.html
Copyright © 2020-2023  润新知