std::move

背景

工作原理

std::move()告诉编译器那部分右值不能释放

std::move()本身就是一个语法糖,可以理解就是一个以函数都形式做类型转换。

移动构造函数、移动赋值函数利用引用的引用

如果只是在某个函数里声明并初始化化了&&类型的变量,其实没有什么实际用处。关键是把它用在参数传递的时候,这样可以避免深拷贝、构建临时变量。

举例

Class A;
Func(A&& a);

main()
{
    A temp;
    Func(std::move(temp));
}

scoped ref

原理

scoped ref 本身只是一个便于在不用资源的时候,自动释放资源的机制。让用户从繁琐、重复的资源管理的工作中解脱出来。

使用它的关键是,需要理解并记住它在什么时候会自动增减引用。

何时自动增减引用

引用计数自动增1的情景

  • 基于对象指针构造引用计数对象的时候;
  • 基于引用计数对象构造引用计数对象的时候;
  • 把对象指针赋值给引用计数对象的时候;
  • 引用计数之间相互赋值(之前的引用计数为空);

引用计数自动减1的情景

  • 如果之前引用计数对象不为空,析构一个引用计数对象的时候;

引用计数不变的场景

  • 引用计数之间相互赋值(之前的引用计数不为空);
  • 声明一个基于不带参数的默认构造函数都引用计数对象时;
  • 把用计数对象赋值给对象指针的时候;