条目十五《注意strng实现的多样性》
条目十五《注意strng实现的多样性》
下面以一个打印string空对象的大小切入本条目:
#include
#include
using namespace std;
int main()
{
string ss;
printf("ss size: %ld\n", sizeof(ss));
return 0;
}
ss size: 32
string和char一样大是常见的,但是string的大小是char的7倍也是常见的。上面例子是在环境是 gun c++下的运行结果,可以看到string的大小是char*的4倍。为什么呢?为了理解这个问题,我们需要看string有哪些实现方式。
方式一:
每个string对象包含:
一个配置器的拷贝
字符串的大小
容量
一个指针(指向包含引用计数(“RefCnt”)和字符串值的动态分配的缓冲区)。

实现一的string大小取决于定义的分配子allocator的大小。使用默认的分配子allocator,sring对象的大小就是char*指针的4倍。就是例子的情况。
方式二:
string的大小等于char指针的大小。每个string对象只包含一个指向一个数据结构的指针(包括了字符串的大小,容量,引用计数,指向动态分配字符串的缓存的地址的指针,其他的控制并发的参数成员【大小大概是char指针的6倍】)。

方式三:
string的大小等于char*指针的大小。每个string对象只包含一个指向数据结构的指针(字符串大小,容量,引用计数,值可共享性数据+字符串值)

方式四:
string的大小是一个char*指针的7倍。当前string的对象小于15时,直接使用小字符串优化,string直接存放字符串对象。当string的对象大于15字节时,缓冲区的第一部分被用作指向一块动态内存的地址的指针。

根据使用场景选择string的实现:
- 1.关注动态分配次数,避免选择方式2。方式1和3是1次,方式2是2次(string对象本身,指向的缓冲区),方式4没有。
- 2.关闭并发。方式3包含了控制并发的参数成员。
- 3.有大量的小字符串。选择方式4.
总结一下string的多样性:
字符串值可能是或可能不是引用计数的。默认情况下,很多实现的确是用了引用计数,但它们通常提供了关闭的方法,一般是通过预处理器宏。引用计数只对频繁拷贝的字符串有帮助,而有些程序不经常拷贝字符串,所以没有那个开销。
string对象的大小可能从1到至少7倍char*指针的大小。
新字符串值的建立可能需要0、1或2次动态分配。
string对象可能是或可能不共享字符串的大小和容量信息。
string可能是或可能不支持每对象配置器。
不同实现对于最小化字符缓冲区的配置器有不同策略。
条目十五《注意strng实现的多样性》的更多相关文章
- 第十五篇 Integration Services:SSIS参数
本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- 马凯军201771010116《面向对象与程序设计Java》第十五周学习知识总结
实验十五 GUI编程练习与应用程序部署 一.知识学习部分 清单文件 每个JAR文件中包含一个用于描述归档特征的清单文件(manifest).清单文件被命名为MANIFEST.MF,它位于JAR文件的 ...
- 刘志梅201771010115.《面向对象程序设计(java)》第十五周学习总结
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1)一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件. 创建一个新的JAR文件应 ...
- 201771010134杨其菊《面向对象程序设计(java)》第十五周学习
第十五周学习总结 第一部分:理论知识 JAR文件: 应用程序首选项存储: Java Web Start JAR文件: 1.Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar ...
- 【译】第十五篇 Integration Services:SSIS参数
本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- CCNP路由实验之十五 NAT(网络地址转换)
CCNP路由实验之十五 NAT(网络地址转换) 众所周知,要让自己的电脑连上Internet,必须要到运营商(ISP)申请一个上网账号,依据此账号申请自己的宽频业务(拨号上网.商业固定IP等等) ...
- 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...
随机推荐
- entityframework.extended 配置mysql
entityframework.extended 这个是个很好的扩展,不过由于默认是配置成MSSQL的,今天在github上面 看到一个解决方案,亲测可用,下面贴代码 1.在DbContext 修改默 ...
- Django中favicon.ico文件的配置
默认情况下,浏览器访问一个网站的时候,同时还会向服务器请求“/favicon.ico”这个URL,目的是获取网站的图标. 若没有配置的话,Django就会返回一个404错误,并且浏览器接收到这个404 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 1_Introduction and Basic Concepts 介绍和基本概念
目录 1.1 欢迎1.2 机器学习是什么 1.2.1 机器学习定义 1.2.2 机器学习算法 - Supervised learning 监督学习 - Unsupervised learning 无 ...
- Linux主机名的设置
Linux主机名的设置 Linux主机名的设置步骤如下: 1.在/etc/sysconfig/network文件中修改HOSTNAME的值为要设置的主机名. HOSTNAME=myhost 2.在/e ...
- 【原创】0. MYSQL++的环境准备
1. 获取 Google MYSQL++,第一个就是,然后跟着要求进行下载. 2. 编译和安装 其实在作者的各种README文档里面已经写得很清楚了,现在对一些可能会出现问题的地方进行一下回顾. Wi ...
- 09-nginx Rewrite语法详解
和location类似,也是要负责URL解析的. rewrite 重写 nginx的配置非常多,nginx的第三方模块也非常非常多.不可能讲每一种模块的配置办法.通常碰到一个nginx的新问题你想怎 ...
- Docker 学习笔记_安装和使用MongoDB
一.准备 1.宿主机OS:Win10 64 2.虚拟机OS:Ubuntu18.04 3.账号:docker 二.安装 1.搜索MongoDB镜像 ...
- while循环 for循环的理解
不管是while循环还是for循环都隐含着一个if else的结构,就是说,if 条件满足,那么就执行循环体内部的语句,else就做循环体外部的事情. 有一个例子我觉得特别典型,程序内部定义了一个特定 ...
- linux信号基本概念及如何产生信号
linux信号基本概念及如何产生信号 摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:34:21 阅读 ...
- AIO和NIO的理解
AIO: AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成,可以继续做 另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程.这样很大程度提高了 ...