C++移动语义的引入目的
主要和深浅拷贝有关
当类对象中包含指针,指针会通过new的方式从堆中申请的空间,在销毁时需要释放对应的内存空间
在调用拷贝构造函数时,对于该指针的拷贝,需要通过深拷贝,即在堆中申请内存的方式来构造一个全新的类对象,避免两个对象的指针指向同一块儿内存区域(浅拷贝)
如果被拷贝的对象即将被释放,或者说是临时对象,我们就可以优化一下这个流程,将新对象的指针指向该临时对象的堆空间,并将该临时对象的指针置空,即一种挪用的思想,又回归了浅拷贝
移动语义就诞生了,也就是浅拷贝
移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源移为已用
class demo{
public:
demo():num(new int(0)){
cout<<"构造函数"<<endl;
}
demo(const demo &d):num(new int(*d.num)){
cout<<"深拷贝构造函数"<<endl;
}
//添加移动构造函数
demo(demo &&d):num(d.num){
d.num = NULL;
cout<<"移动构造函数"<<endl;
}
~demo(){
cout<<"析构对象"<<endl;
}
private:
int *num;
};
demo get_demo(){
return demo();//函数栈空间构造临时对象并申请堆空间内存,返回的对象还需要进行一次深拷贝
}
int main(){
demo a = get_demo();//再调用一次深拷贝,将返回的对象拷贝给a
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端