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。