1.背景
临时对象拷贝很消耗资源,通过移动语义可以避免拷贝的资源消耗。资源转移(一份不变)不拷贝(变成两份)资源
2.针对范围
移动语义主要针对复杂类型(如STL容器和智能指针)和自定义类型,对于内置类型执行的还是拷贝操作
2.1内置类型
int&& x=10;
int y=std::move(x);
本质上还是执行的是拷贝操作
2.2复杂类型
Student stu;
Student s=std::move(stu);
触发移动构造函数,使用移动语义,进行资源的移动。
3.移动语义前后资源的变化
| 层次 | 移动前 (Student stu;) | 移动后 (Student s = std::move(stu);) |
|---|---|---|
| 栈对象本身 | stu 在栈上,内部有指针成员 data_ptr data_ptr1 | stu 仍在栈上,但 data_ptr = nullptr data_ptr1 = nullptr |
| 内部指针 | stu.data_ptr 指向堆内存 stu.data_ptr1 指向栈内存 | s.data_ptr 接管原来的堆内存地址 s.data_ptr1 指向原来stu.data_ptr1指向的栈内存 |
| 堆资源 | 堆上有一份资源数据,归 stu 管理 | 堆资源仍然存在,但归 s 管理,所有权转移了 |
| 栈资源 | stu栈资源指针指向栈资源 | s指向原来stu指向的 |
堆资源:存在所有权的转移(谁拥有谁负责释放)
栈资源:不存在所有权,所以不存在所有权转移,指针只是引用,移动的只是指针指向的值,不会影响栈对象本身,栈对象本身的销毁由编译器负责不需要程序员负责释放。