std::list 源代码解析
首先声明,下面的讲解都是针对GCC2.9,std::alloc
通过下面的源代码大家可以看到list类的内部成员是一个node,而他的类型是linktype,前面的typedef里面有介绍是一个指针,所以,当我们创建一个对象的时候,他的大小是4,只有一个指针,而listnode是一个结构体,void *的两个指针,因为list是一个双向链表,而且还是一个环状的,所有有两个指针
iterrator:我们如何查看list里面的元素呢,我们需要使用iterator迭代器,我们说迭代器是一个指针,那他到底是什么指针,除了vector和arrar,(因为他们两个的内存空间是连续的),其他的序列式容器的迭代器都是一个类类型的,因为list的各个元素相互·1独立,他们不能通过单存的++就可以实现地址的++进而取得元素,相反,他们内部需要进行某些处理获得下一个元素的位置,所以我们看到第二张图片(*node).mext,在++的重载函数里面,他首先获得里面的next,在跳转到下一个元素返回
前置版本返回一个引用【Fraction& operator++()】,后置版本返回一个const值【const Fraction operator ++(int)】。
后置版本是利用前置版本来实现的。节约代码,控制代码有余。
前置版本的效率高,因为后置版本需要调用前置版本,所有后置版本效率比前置要低。(++i比i++效率高。)
在后置版本里,人为添加一个参数(int),主要是为了区别前置版本,这个参数不会被使用。
他们的返回值一个是&,一个是非引用,
下满举一个例子
++++i
i++++
上面两个都执行两次++,但是前置的可以,后置的就不可以,所以,为了满足上面的这种要求,前置的要求返回引用,后置的不能返回引用,就可以解决是否可以前置后置两次++的问题了
***************************G4.9***********************************************
下面就是两者的主要区别list_iterator传的参数变了,省去了没有必要的引用和指针,list_node结构变了,之前point和data封装在一起,现在单独开了,
以前l2.9,空list对象4个字节,现在8个,可以看一下上面的结构,list为空。但是继承了listbase,listbase包含了listimpl,listimpl又包含了list_node_base,里面有两个指针,所以大小为8
转载于:https://www.cnblogs.com/13224ACMer/p/6389622.html
std::list 源代码解析相关推荐
- Spring源代码解析(收藏)
Spring源代码解析(收藏) Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启 ...
- Android源代码解析之(四)--gt;HandlerThread
转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了AsyncTast的基本使用以及实现原理,我们知道AsyncTask内部是通过线程池和Handler实现的.通过对线程池和handler的封装实现 ...
- Tomcat源代码解析系列
学web也有一段时间了.为了从底层了解web应用在Tomcat中的执行,决定看一下Tomcat的源代码參见<How Tomcat works> 和大牛博客.对大体架构有了一定的了解, ...
- 【backtrader源码解析52】indicators部分代码解读(枯燥,仅供参考,源代码解析结束,后面会增加一个backtrader框架分析)
指标类里面有很多不同的指标,如果对如何使用指标做策略感兴趣的话,可以考虑阅读下相关的源码和指标的用法,就仅仅指标的源代码而言,似乎没有什么可讲的.另外,关于backtrader源代码的注释,放到网站上 ...
- overlayfs源代码解析
overlayfs源代码解析 mount挂载 注册文件系统 挂载文件系统 读写目录 openat系统调用打开目录 getdents系统调用,搜索目录 创建/删除文件 创建文件 删除文件 读写文件 读/ ...
- 历经一个月,终于搞定了SVM(支持向量机)-附源代码解析
历经一个月,终于搞定了SVM(支持向量机)-附源代码解析 前言 其实整体算下来,断断续续的也得有快两个月了(原谅博主比较笨).中间也有好几次放弃,不想写这篇总结了,但是之前立下的誓言,要将学习到的每一 ...
- Mozilla FireFox Gecko内核源代码解析(4.nsHTMLTokens)
之前我们分析了nsHTMLTokenizer(详见其解析篇),其中我们了解到了,其中设计了如何配合 nsScanner对输入流循环地解析流程,如怎么进行回溯等流式操作.实际上其中并没有包含具体的字符比 ...
- AnnaKournikova病毒源代码解析
AnnaKournikova病毒源代码解析 AnnaKournikova病毒源代码解析 本帖版权归原作者,其它网站转载须注明出处,传统媒体转载须事先与原作者和e龙西祠胡同[http://www.xic ...
- php病毒源代码,HTML_vbs病毒的简单例子源代码解析,说明:作者对某些代码进行了 - phpStudy...
vbs病毒的简单例子源代码解析 说明:作者对某些代码进行了修改.该文件是一个完整的程序.该文件执行之后,会寻找硬盘上所有满足条件的文件,对其进行强制性覆盖(满足条件的文件数据将全部丢失).并再创建一个 ...
最新文章
- 处理机调度的性能准则
- com.android.dex.DexIndexOverflowException: Cannot merge new index 66299 into a non-jumbo instruction
- 在Linux中如何查看文件的修改日期
- 内存的使用和优化的注意事项
- Node.js入门 - 回调函数
- 斯坦福 cs234 强化学习笔记整理活动 | ApacheCN
- SQL语句操作优先级顺序
- 【白皮书分享】直播社会价值白皮书-字节跳动.pdf(附下载链接)
- 插入模板_巧用Focusky模板制作精美微课
- 用python画玫瑰花-使用Python画一朵玫瑰花
- CSU Scientific Conference
- “熊猫烧香”源码启示录
- 创始人之间应该如何量化分配股权?
- 微信小程序 (布局适配与物理逻辑像素)
- 如何在Chrome浏览器下清除DNS缓存
- Three.js快速入门
- Wi-Fi显示“无Internet,安全”是怎么回事?
- 阿里云OCR图片识别
- 精确计算时,不要使用float或double
- 混沌映射singer map 和 logistic map分叉图
热门文章
- hadoop-0.20.2完全分布式集群
- 自写函数的防抖和节流
- JavaScript中eval()和$.parseJSON()的区别和联系以及JSON.stringify()的区别
- 读取swagger配置文件里的内容
- 2021年贵金属黄金会迎来大行情吗?
- 在消费中,一味的贪图价格的便宜,而忽视价值的人
- 现在很多人都在网上找富业
- 成年人的世界里,赚钱是保护自己和身边人最高效的手段
- OKR是什么、OKR有什么用?
- Qt4_子类化QTableWidgetItem