常州外贸集团 网站建设,新手如何建站,电商设计一般都是做什么,动态速写网站C中的移动构造函数
所谓移动语义#xff0c;指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解#xff0c;移动语义指的就是将其他对象#xff08;通常是临时对象#xff09;拥有的内存资源“移为已用”。
以前面程序中的 demo 类为例#xff0c;该…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编译器严格地调用复制构造函数反而降低了性能如果复制的对象很大对性能的影响将很严重。 为避免这种性能瓶颈 C11 引入了移动构造函数。移动构造函数的语法如下
// move constructor
MyString(MyString moveSource)
{if(moveSource.buffer ! NULL){buffer moveSource.buffer; // take ownership i.e. movemoveSource.buffer NULL; // set the move source to NULL}
}有移动构造函数时编译器将自动使用它来“移动”临时资源从而避免深复制。实现移动构造函数后应将前面的注释改成下面这样
MyString sayHelloAgain(Copy(sayHello)); // invokes 1x copy, 1x move constructors移动构造函数通常是利用移动赋值运算符实现的。该示例程序是一个更好的 MyString 版本实现了移动构造函数和移动赋值运算符。
该文章会更新欢迎大家批评指正。
推荐一个零声学院的C服务器开发课程个人觉得老师讲得不错 分享给大家LinuxNginxZeroMQMySQLRedis fastdfsMongoDBZK流媒体CDNP2PK8SDocker TCP/IP协程DPDK等技术内容 点击立即学习C/C后台高级服务器课程