C++ STL和泛型编程(四)----movable

一、moveable对各容器的影响

在这里插入图片描述
其对vector的影响表现在 ctor / move ctor【因为vector存在空间不足时得重新扩展,然后再拷贝到新空间的情况,所以最终得到的vector的ctor和move ctor时间上差别明显。而其他容器的ctor和move ctor则差别不大,主要差别在copy ctor 和 move ctor】copy ctor / move ctor 上,因为move ctor只是将原来的指针拷贝过来【进行的是指针的拷贝即浅拷贝,而不对原本的元素数据进行拷贝 (深拷贝)

另外之后传入3百万元素,但却调用了7百多万次拷贝构造函数,是因为vector容器当容器空间不足时,会有一个2倍扩展内存空间的做法【此时在新空间又会将原本的数据复制到新的内存区域,这样子就会出现重复拷贝构造前面已出现的元素】,所以会出现调用了7百多万次构造函数的情况。

下面容器的ctor和move ctor则差别不大,主要差别在copy ctor 和 move ctor:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、moveable class

在这里插入图片描述这里的char* _data 说明 _data为指向字符串数据变量的指针【即如char* _data = “hello”】,然后其ctor为传入指向一串字符串变量的指针变量p,然后调用_init_data( p )。进入_init_data( p )内部,new出新的_data指针所指向的内存空间,然后通过memcpy()将传入的长度为_len的s表示的字符串变量拷贝到_data指针所指向的新的内存空间中。最后_data[_len]=‘\0’即_data所指向的新的内存空间的最后一个位置存放截止符元素。

而对于move ctor【通过’&&'进行辨别 】,其是将原字符串变量的指针地址传入_data中,然后原str的_len清空为0,而且释放掉原字符串的指针地址【str._data=NULL,原指针指向空,这样就不用在后面dtor再释放一次】。这个操作过程类似于浅拷贝,但实际上又和浅拷贝不太一样【因为浅拷贝是原指针和新指针均指向同一个地址,但这里的新指针指向原地址,而原指针则指向NULL被释放掉!】。

因而,moveable操作只是对指针进行copy操作,而无需new出一份新的内存地址并copy元素过去新的内存地址上,只是将指针指向原地址则大大提高了代码时间效益!!
在这里插入图片描述dtor时需注意,要先判断下_data是否已指向NULL,这样避免二次释放指针!

三、测试函数

在这里插入图片描述注意:因为用了std::move则会导致c1的指针指向NULL,所以接下来必须确保不会再使用到c1
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值