C++是怎么实现string的


本篇内容主要讲解“C++是怎么实现string的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++是怎么实现string的”吧!常见的string实现方式有两种,一种是深拷贝的方式,一种是COW(copy on write)写时拷贝方式,以前多数使用COW方式,但由于目前多线程使用越来越多,COW技术在多线程中会有额外的性能恶化,所以现在多数使用深拷贝的方式,但了解COW的技术实现还是很有必要的。这里会对这两种方式都进行源码分析,正文内容较少,更多内容都在源码的注释中。string的内容主要在gcc源码的三个文件中:在分析前先介绍下string或者C++ stl中几个基本的概念:size: 表示真实数据的大小,一般resize函数改变的就是这个值。capacity:表示内部实际已经分配的内存大小,capacity一定大于等于size,当size超过这个容量时会触发重新分配机制,一般reserve函数改变的就是这个值。文件中有如下代码:这里可以看到string其实真实的样子是basic_string,这里可以看下basic_string真实的结构:从这里可以看见整个basic_string的结构如图:看下面代码:这段代码会调用普通构造函数,对应的源码实现如下:而_M_local_data()的实现如下:这里可以看见_M_dataplus表示实际存放数据的地方,当string是空的时候,其实就是指向_M_local_buf,且_M_string_length是0。当由char*构造string时,构造函数如下:首先让_M_dataplus指向local_buf,再看下_M_construct的实现,具体分析可以看下我代码中添加的注释:再分析下内部的内存申请函数_M_create:再分析下内部的内存释放函数_M_dispose函数:再分析下basic_string的拷贝构造函数:再分析下basic_string的赋值构造函数:再分析下移动构造函数:移动赋值函数和移动构造函数类似,就不作过多分析啦。先看下部分源代码了解下COW的basic_string的结构:具体分析可以看代码中注释,可以分析出COW的string结构如图:前面程序喵分析过深拷贝方式下string的局部内存为_M_local_buf,那COW下string的_S_empty_rep_storage是什么样子呢?直接看源代码:再分析下构造函数:再看下string内部_M_create是如何申请内存的这里有关于malloc的知识点可以看我之前写免费云主机域名的文章,前面Rep有个_M_set_length_and_sharable方法,看下它的源码:COW版本主要就是为了避免过多的拷贝,这里看下string的拷贝构造函数:再分析下string的析构函数:我们以前学习工作过程中都知道str有data和c_str函数,看资料都说它们的区别是一个带结束符,一个不带。 这里看下源码:这里可以看见它俩没有任何区别,因为结束符其实在最开始构造string对象的时候就已经添加啦。这里直接看代码:这里可以看出所有的数值类型转string,都是通过vsnprintf来实现,具体vsnprintf是什么这里就不过多介绍啦,读者可以自行查找下相关用法哈。到此,相信大家对“C++是怎么实现string的”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/03 19:29
Next 07/03 19:37

相关推荐