首页 > 其他分享 >string 的扩容机制

string 的扩容机制

时间:2023-12-09 20:57:33浏览次数:27  
标签:扩容 Count Capacity string 容量 机制 size

C++ string 类的扩容机制主要取决于编译器的实现,但一般来说,它们都遵循一种动态数组的策略,即当字符串的大小超过当前容量时,就会分配更大的内存空间。以下是一种常见的扩容策略1

size_type _Grow_to(size_type _Count) const {
  size_type _Capacity = capacity();
  if (_Capacity < 32) {
    _Capacity = _Capacity + 16;
  } else {
    _Capacity = max_size() - _Capacity / 2 < _Capacity ? 0 : _Capacity + _Capacity / 2; // try to grow by 50%
  }
  if (_Capacity < _Count)
    _Capacity = _Count;
  return (_Capacity);
}

在这个策略中,如果当前容量 _Capacity 小于32,那么新的容量将增加16。如果当前容量大于或等于32,那么新的容量将增加50%,即 _Capacity + _Capacity / 2。然后,如果新的容量仍然小于所需的容量 _Count,那么新的容量将设置为 _Count

这种扩容策略的目的是在需要更多空间时,提供比当前容量大一些的空间,以减少未来可能的内存重新分配的次数,从而提高性能。这是一种权衡,旨在在内存使用效率和性能之间找到平衡。

需要注意的是,不同的编译器可能会有不同的扩容策略。例如,对于 vectorg++ 是2倍扩容,msvc 是1.5倍扩容;对于 string,如果字符串没有超过15个字节,都是分配在栈上,容量都是15;一旦超过了15个字节,则分配在堆上,g++ 的扩容机制是2倍,msvc 的扩容机制是每次+161。这些差异主要取决于编译器的设计者如何权衡内存使用和性能。 

标签:扩容,Count,Capacity,string,容量,机制,size
From: https://www.cnblogs.com/whcjob/p/17891466.html

相关文章

  • sql中的substring()、to_char()、extract()、concat()等函数
    ERROR:functionpg_catalog.substring(timestampwithouttimezone,integer,integer)doesnotexistLINE1:SELECTu.username,l.description,l.ip,SUBSTRING(l.createdate,…^HINT:Nofunctionmatchesthegivennameandargumenttypes.Youmightneedtoadde......
  • Java 中日期String类型与Date类型相互转化
    JavaString类型转换成Date日期类型插入数据库时,存入当前日期,需要格式转换importjava.text.SimpleDateFormat;formatter=newSimpleDateFormat("yyyy-MM-dd");Stringdate=formatter.format(newDate());//格式化数据,取当前时间结果为2014-10-30String格式的数据转化成......
  • C++ Qt开发:字符串QString容器
    在Qt框架中,QString是一个强大而灵活的字符串容器,专为处理Unicode字符而设计。它提供了许多方便的方法来操作和处理字符串,使得在跨平台开发中能够轻松地进行文本操作。QString是Qt开发中不可或缺的一部分,它的灵活性和强大的功能使其成为处理文本和字符串操作的理想选择。本篇......
  • Redis数据结构2:REDIS_STRING(SDS)
    REDIS_STRING(SDS)SDS全称SimpleDynamicString(简单动态字符串),是专为Redis设计的简易字符串实现。Redis并未采用C语言传统字符串char*,而是自己设计了一套字符串实现标准。传统字符串的缺陷C语言字符串实际上就是一个以'\0'结尾的字符数组。例如:char*myName="ErickRen";......
  • pytest + yaml 框架 -59.用例失败重跑机制pytest-rerunfailures
    前言有些接口可能不太稳定,第一次跑的时候由于网络原因或者其它原因失败,但是重新跑2次又成功了。对于这种需要重新跑几次的场景,可以使用用例失败重跑机制,需安装pytest-rerunfailures插件。场景示例失败重跑需要依赖pytest-rerunfailures插件,使用pip安装就行pipinstallp......
  • JDBC针对SQLServer的sendStringParametersAsUnicode=false的验证
    JDBC针对SQLServer的sendStringParametersAsUnicode=false的验证背景部分客户的SQLServer数据库出现了大量死锁的情况.虽然部分客户并没有反馈死锁影响了产品的正常使用但是在大量业务时还是会出现卡顿等的现象基于此,经过微软case的研究,发现是JDBC4.0之后默认为ture的......
  • Nacos源码(七):客户端实例变更事件机制源码分析
    在给出的NamingExample示例中,给出客户端订阅的代码,详情如下:客户端的订阅机制是通过事件完成的,NacosNamingService#subscribe()详情如下:客户端订阅主要步骤:1、注册事件监听器2、客户端订阅客户端订阅在Nacos源码(六):客户端服务发现源码分析中已经做了......
  • (四)虚拟机下linux磁盘扩容
    在VM虚拟机中,我们经常会选择默认磁盘大小20G,用着用着才发现20G不够用,服务启动不了,就很尴尬,让我们今天一起来学习下,如何在虚拟机给磁盘扩容。一、加物理盘我们使用df-h命令,发现磁盘使用率已经37%,我们给此磁盘扩容,简单演示下扩容的过程。 虚拟机开机后,我们用fdisk-l 命令查......
  • UVM_factory机制
    什么是factory机制?最大的优点?factory机制最主要的三个特点就是封装、继承、多态。其最主要的优势就是子类的指针以父类的类型传递时其表现形式仍然是子类行为。virtual在重载里的作用,其函数仍然保留。UVM重载的步骤首先先注册·uvm_object_utils()和`uvm_component_util......
  • 浅谈clickhouse的Mutation机制(附源码分析)
    最近研究了一点ch的代码。发现一个很有意思的词,mutation。google这个词有突变的意思,但更多的相关文章翻译这个为"订正"。上一篇文章分析了background_pool_size参数。这个参数和后台异步工作线程池merge工作有关。ClickHouse内核中异步merge、mutation工作由统一的工作线程池来完成......