C++中的移动构造函数

编程入门 行业动态 更新时间:2024-10-28 16:27:59

C++中的移动构造<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数"/>

C++中的移动构造函数

C++中的移动构造函数

所谓移动语义,指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解,移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。

以前面程序中的 demo 类为例,该类的成员都包含一个整形的指针成员,其默认指向的是容纳一个整形变量的堆空间。当使用 get_demo() 函数返回的临时对象初始化 a 时,我们只需要将临时对象的 num 指针直接浅拷贝给 a.num,然后修改该临时对象中 num 指针的指向(通常另其指向 NULL),这样就完成了 a.num 的初始化。

事实上,对于程序执行过程中产生的临时对象,往往只用于传递数据(没有其它的用处),并且会很快会被销毁。因此在使用临时对象初始化新对象时,我们可以将其包含的指针成员指向的内存资源直接移给新对象所有,无需再新拷贝一份,这大大提高了初始化的执行效率。

由于 C++的特征和需求,有些情况下对象会自动被复制。请看下面的代码:

class MyString
{// pick implementation from Listing 9.9
};MyString Copy(MyString& source) // function
{MyString copyForReturn(source.GetString()); // create copyreturn copyForReturn; // return by value invokes copy constructor
}int main()
{MyString sayHello ("Hello World of C++");MyString sayHelloAgain(Copy(sayHello)); // invokes 2x copy constructorreturn 0;
}

正如注释指出的,实例化 sayHelloAgain 时,由于调用了函数 Copy(sayHello),而它按值返回一个 MyString,因此调用了复制构造函数两次。然而,这个返回的值存在时间很短,且在该表达式外不可用。因此, C++编译器严格地调用复制构造函数反而降低了性能,如果复制的对象很大,对性能的影响将很严重。
为避免这种性能瓶颈, C++11 引入了移动构造函数。移动构造函数的语法如下:

// move constructor
MyString(MyString&& moveSource)
{if(moveSource.buffer != NULL){buffer = moveSource.buffer; // take ownership i.e. 'move'moveSource.buffer = NULL; // set the move source to NULL}
}

有移动构造函数时,编译器将自动使用它来“移动”临时资源,从而避免深复制。实现移动构造函数后,应将前面的注释改成下面这样:

MyString sayHelloAgain(Copy(sayHello)); // invokes 1x copy, 1x move constructors

移动构造函数通常是利用移动赋值运算符实现的。该示例程序是一个更好的 MyString 版本,实现了移动构造函数和移动赋值运算符。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

更多推荐

C++中的移动构造函数

本文发布于:2023-11-16 15:13:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1627135.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!