条目十五《注意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实现的多样性》的更多相关文章

  1. 第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  2. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  3. 马凯军201771010116《面向对象与程序设计Java》第十五周学习知识总结

    实验十五  GUI编程练习与应用程序部署 一.知识学习部分 清单文件 每个JAR文件中包含一个用于描述归档特征的清单文件(manifest).清单文件被命名为MANIFEST.MF,它位于JAR文件的 ...

  4. 刘志梅201771010115.《面向对象程序设计(java)》第十五周学习总结

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1)一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件. 创建一个新的JAR文件应 ...

  5. 201771010134杨其菊《面向对象程序设计(java)》第十五周学习

    第十五周学习总结 第一部分:理论知识 JAR文件: 应用程序首选项存储: Java Web Start JAR文件: 1.Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar ...

  6. 【译】第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  7. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  8. CCNP路由实验之十五 NAT(网络地址转换)

     CCNP路由实验之十五 NAT(网络地址转换) 众所周知,要让自己的电脑连上Internet,必须要到运营商(ISP)申请一个上网账号,依据此账号申请自己的宽频业务(拨号上网.商业固定IP等等) ...

  9. 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...

随机推荐

  1. BurpSuite系列(十一)----Project options模块(项目选择)

    一.简介 Project options主要用来对Project的一些设置. 二.模块说明 Project options主要由五个模块组成: 1.Connections 连接2.HTTP3.SSL4 ...

  2. sql合并列

    oralce写法: select WM_CONCAT(A.title) as citys from tmpcity A sql server写法: select stuff((select ','+A ...

  3. 201671010140. 2016-2017-2 《Java程序设计》java学习第六章

    java学习第六章    本周对与java中的接口,lambda表达式与内部类进行了学习,以下是我在学习中的一些体会:    1.接口: <1>.接口中的所有常量必须是public sta ...

  4. FP服务无法启动,端口被占用

    一.错误如下: Starting CISAgent..Exception in thread "main" com.i2.cis.util.SystemConfigurationE ...

  5. jQuery简单介绍及基本用法(选择器&DOM操作)

    简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“write Le ...

  6. 【原创】9. MYSQL++中的Field、FieldNames以及FieldTypes类型

    mysqlpp::Field其实使用的并不多,主要在于Result.h中ResultBase以及他的派生类型(UseQueryResult和StoreQueryResult)的几个获取下一个field ...

  7. mysql 基本操作 alter

    查看数据库 show  databases; 新建数据库 命令 create database 库名字. 选择数据库 use  2016test; 创建表:create table 表名(字段1,2, ...

  8. mongo状态查看方法

    列举一些常用的mongodb状态查看方法. 1.mongostat 是mongdb自带的状态检测工具, inserts/s 每秒插入次数 query/s 每秒查询次数 update/s 每秒更新次数 ...

  9. 面试题:JavaIO流分类详解与常用流用法实例

    Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单 ...

  10. xgboost 并行调参

    Parallelism When Cross Validating XGBoost Models This raises the question as to how cross validation ...