首页 > 编程语言 >C++移动语义的引入目的

C++移动语义的引入目的

时间:2023-01-22 11:33:36浏览次数:38  
标签:对象 语义 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;
}

标签:对象,语义,C++,内存,引入,拷贝,移动,指针
From: https://www.cnblogs.com/lxzbky/p/17064320.html

相关文章

  • C++内存分配方法new与placement new使用方法详解
    tags:C++写在前面总结一下C++内存分配中的​​new​​​/​​delete​​​方法,以及一个很有意思的工具:​​placementnew​​.参考:cppprimer5ed,pp409,pp726(19.1).......
  • 验证二叉搜索树的C++实现多种解法
    tags:C++DSABinaryTree写在前面给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点......
  • 详细实例说明+典型案例实现 对迭代法进行全面分析 | C++
    第四章迭代法:::hljs-center目录第四章迭代法●前言●一、迭代法是什么?1.简要介绍2.代码示例(简单理解)3.生活实例●二、迭代法的典型案例——开平方&帕......
  • C++的宏利用include和undef来重复使用
    如dll导出函数,需要定义以及QueryInterface,其中函数有多个,如果想代码尽量简洁,只有这个方法定义#defineNVIDIA_API_DEF(_fun) decltype(_fun) *_##_fun=NUL......
  • c++中运算符重载总结
    运算符重载的本质是函数重载。语法格式重载函数的一般格式如下:返值类型operator运算符名称(形参表列){    重载实体;}operator运算符名称在一起构成了新的函......
  • [C/C++] 简单实现按字符分割字符串split函数
    记录一下/***字符串str通过字符target进行分割*/vector<string>split(stringstr,chartarget){vector<string>res;intpos=0;while(po......
  • c/c++ mysql api函数
    一、常用APImysql_affected_rows()返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。mysql_autocommit()切换autocommit模式,ON/OFFmysql_change_user()......
  • C++概述、选择结构、循环结构
    目录1C++概述1.1计算两个整数相加之和1.2计算三个整数相加之和2选择结构2.1小老鼠走迷宫1(if语句)2.2小老鼠走迷宫1(if语句)(多个单分支结构)2.3小老鼠走迷宫2(switch语句)2......
  • C++实战笔记(三)异常处理
    tags:C++Interview写在前面简单总结一下C++异常处理部分(Exception).异常只是C++为了处理错误提出的一种解决方案,并不是唯一的一种.异常处理特点异常处理的流程完全独立......
  • c++ return
    return本是上是一个拷贝过程,不过是右值拷贝,也就是无标记变量的拷贝。不管是返回指针还是返回值,return首先将要return的值存到eax寄存器中,回到父函数再将返回的值赋给变量......