其他分享
首页 > 其他分享> > move操作

move操作

作者:互联网

三/五法则里,前三个一开始也没弄清楚,后两个中的一个今天才有了一种理解。

string数组和string *数组。前者访问元素sa[n],后者访问元素*psa[n],没有关系,下标运算符的优先级高于解引用运算符。

程序的运行结果是第三张图。和reallocate的思路一致,和之前对string的理解也一致。

问题在于如何理解move函数,和移后源可正常销毁。

先说明,这一小节的程序是承上启下。启下就是引出之后的移动构造函数。我之前就没怎么看明白,所以我现在的理解全无根据,以下全是猜测。

第一个猜测点:move函数的地基是动态内存。

之前看sizeof,说其对容器的运算,求得的是容器类型公共部分的大小。第三张图也给出来了,即使是move,新得到的string对象的地址已经是不同了。

我之所以要给出string数组和string *数组,有两个原因。第一,动态对象可以交接,交换地址即可。这是我推测的move实质。遗憾的是,读法和地址,都不支持这一种猜测。第二,受C的影响,new的结构体,就是一整块内存,往里写东西。这是我一直没有正确理解string对象的原因。

第二个猜测点:容器的实现,基于一个指向动态内存的指针。这就是sizeof得到公共部分的大小的解释,全部都是公共部分。对此补充一个小推测,string的拷贝构造函数无法用合成版本,合成版本必然是浅拷贝。

allocate申请的string对象的数组内存,其保存的也是string对象,但不包括可变字符数组,可变字符数组另外申请内存,由string对象管理。所以在move操作之后,string对象仍可被摧毁。

关于move猜测的立足点即是,move操作对动态内存进行了交接。加深一个推测,move操作之后,移后源只能被析构,因为不是swap,而接收者还可以一无所有。

move操作存在的原因是,程序语言设计的思想认为,拷贝一个string对象的公共部分很容易,但销毁和重新分配动态内存涉及的开销不可忽略。

基于以上两个猜测的推测。construct的参数列表是p + args。move操作的返回值一定匹配string的构造函数,参照已知的构造函数,返回值不能是string对象或string对象的引用,一则匹配到拷贝构造函数,结果是深拷贝,再则,对于string对象,参数的传递又用了一次拷贝构造函数。和使用move的初衷相违背。即,第一,move的返回值类型至今未见到过,第二,construct使用的string的构造函数,至今也未见到过。这就涉及到两个概念,算是带着疑问接着往下看。

基于以上猜测,之前屡屡出现的swap操作作为tmp的实现,tmp是对象还是对象的若干个成员,分情况而定。而那专门拿一节来讲,但又讲不清楚的迭代器失效问题,跟动态内存脱不了干系。

如容器那里,讲顺序容器,先讲容器,再讲顺序容器。之后讲关联容器,对于容器共有的操作,关联容器章节基本不涉及,但实际使用起来又不太熟练。而且,出现在顺序容器里的容器操作,在看顺序容器时,区分没有价值,反而会糊里糊涂。之后用于关联容器,当时就没有用于关联容器的意识,看关联容器的时候,必须回头看。但容器操作那里,举例全是顺序容器,说是回头看,说白了是回头挨个试。

这里,动态内存在第12章,当然,12章里牵扯到13章的实现。13章讲move,其思想在sizeof,容器,迭代器,swap等概念中,已经出现。迭代器失效问题出现在第9章。而在真正讲到move时,前面几个概念中的关键才浮出水面,而其中的关联性,得自己想出来,然后自己给出解释。

我想到了白中英的计算机组成原理,大三的时候,课上没听明白的内容,书里讲得特别清楚,整本书我都啃完了。不像这本书,看得折磨人。

我以前总被教育,要在垃圾堆里找宝石。可人的追求一直这么低,直接吃屎算了,还翻什么垃圾堆。我看这本书,自然是这本书有很多的可取之处。别说这本书了,去年年底今年年初看的交互式计算机图形学,不也还是有可取之处嘛,比这本书还要少一些,我难道没看完?不过交计看完以后挺后悔的,收获有,但和付出比,像红枣和西瓜。这本书,收获贼多,但不应该像这样颠三倒四,作者的水平真不至于,所以让人觉得厌烦。

水桶的木板,瑜难庇瑕呀。

 

 

标签:容器,string,对象,move,动态内存,操作,构造函数
来源: https://www.cnblogs.com/toughcactus/p/16584701.html