C++移动语义

9 阅读1分钟

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_ptr1stu 仍在栈上,但 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指向的

堆资源:存在所有权的转移(谁拥有谁负责释放)
栈资源:不存在所有权,所以不存在所有权转移,指针只是引用,移动的只是指针指向的值,不会影响栈对象本身,栈对象本身的销毁由编译器负责不需要程序员负责释放。