bosthhe1 / cpushpush

0 stars 0 forks source link

右值引用的移动构造 #40

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

首先我们需要知道左值引用和右值引用都是对引用对象取别名,左值引用是可以对引用对象取地址,而右值引用不可以对引用对象取地址,左值是可以出现在赋值符号左右边,而右值只能出现在赋值符号右边,左值加const引用可以引用右值,右值引用只能引用右值,右值引用的本质是,将右值开空间,拿给右值引用 右值分为纯右值和将亡值,将亡值就是函数的返回值不能应用返回的值,出了作用域就会销毁 左值是在内存中开辟空间的,但是右值只是存在于CPU或者寄存器中 7BZ2TQM}XK68R3@D8 M 82V 我们可以看到,左值加const可以引用右值,右值不能直接引用左值,需要调用move函数,move函数相当于将左值强制转化为右值,才能引用 image

bosthhe1 commented 1 year ago
class A
{
public:
    A()
    {
        cout << "A()" << endl;
    }
    A(A&& _a)//实际这里移动构造的用途是使用现代写法进行交换,提高效率,如果没有移动构造,func函数会走拷贝构造,代价大
    {
        cout << "A&& _a" << endl;
    }
    A func()//如果没有移动构造,那么tmp返回会进行深拷贝,这里有移动构造,代价比深拷贝小很多
    {
        A tmp;
        return tmp;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
private:
    size_t _size = 0;
};
int main()
{
    A a;
    A b = a.func();
    return 0;
}

image 这里为什么会去调移动构造或者拷贝构造,是因为编译器去调用最匹配的那个,如果值为左值那么就去调用拷贝构造,如果值为右值那么就去调移动构造