ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

move操作

2022-08-14 02:00:23  阅读:179  来源: 互联网

标签:容器 string 对象 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有