std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用

       在std::string中,capacity()为当前string占用内存字符的长度,表示当前string的容量,可以理解为一个预分配制度,如果当前的string不断进行扩展操作,则不需要每次都进行内存上的分配,提高程序的运行效率。所以capacity的值会大于等于size,而不是代表当前string的实际大小。

2、Gcc分配策略

        查看Gcc关于string的capacity的代码,大致如下:

分配通过_M_mutate实现,_M_mutate再调用_M_create,调用实际的分配策略。

_M_mutate():

_M_create():

_M_max_size()如下:

       可以看到,当所要扩容后的capacity如果大于_M_max_size,会抛出异常。这里不展开关注,只需要关注在正常可以扩容的情况下的capacity的变化。如果所要扩容后的capacity大于老的capacity,则进行二倍的的扩展。这就是Gcc的分配策略。

3、MSVC分配策略

MSVC通过_Calculate_growth()完成capacity的扩容处理。代码如下:

        _ALLOC_MASK,为15,这个值是在编译期确定的值

        每次capacity分配都会将需要将string的请求长度_Requested与_Alloc_Mask进行或运算,得到一个_Requested加上一个<=15的值_Masked如果该值大于_Max,则最大分配为_Max,不会像Gcc先抛出异常。

        然后将该值与旧值大小的1/2增长进行比较,取两者的较大的值为新的capacity。

4、代码验证

        测试思路,先定义一个空的string,查看初始的capacity值,然后做10次扩容测试,查看每次扩容后的capacity情况。

测试代码如下:

#include <iostream>
#include <string>
using namespace std;
int main()
{std::string str;std::cout<<"origin capacity: "<<str.capacity() << " size: "<<str.size()<<std::endl;for (int i = 0; i < 10; i++){auto cap = str.capacity();while(str.size() <= cap){str.append("1");}std::cout<<"capacity: "<<str.capacity() << " size: "<<str.size()<<std::endl;}return 0;
}

4.1 Windows下capacity变化情况

        可以看出,一个空的string的capacity初始值系统分配为15,然后再扩容后,后面每次capacity的大小为size/2 + size

4.2 Linux下capacity变化情况

Linux下为一个空的string分配的初始capacity也是15,后面每次进行扩容,都是当前(size/2)*2。

5、横向比对Gcc和MSVC的分配策略

        MSVC的扩容要小于Gcc下的扩容大小,这决定了在Linux下string进行不断进行增大时,效率要优于Windows,分配的频率会小于Windows。但是Linux下分配会占用的内存大于Windwos环境,这也可以理解,因为Linux本身运行的程序多为企业级多并发的大程序,利用Linux高资源的特点,可以用空间换时间,获得更快的运行效率。而Windows下运行的多为单机程序,运行的程序不像Linux环境下那么庞大,也不需要极致的空间置换时间,且Wndows的系统资源比较有限,这样可以在保证程序高效运行的情况下,兼顾系统资源在多程序之间的合理分配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【银行测试】银行金融项目测试总结+面试题汇总(答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行项目测试的…

人型动画足部IK权重曲线烘焙

简介 如下图所示&#xff0c;Left、Right FootIK Weight两条动画曲线用于设置人物角色足部IK时获取权重值&#xff0c;手动编辑且动画片段较多时比较费事&#xff0c;可以考虑程序化烘焙这两条足部IK权重曲线。 实现思路 创建新的编辑器窗口&#xff0c;在OnGUI中获取当前所…

FART12刷机脱壳记录笔记

其他脱壳笔记&#xff1a; https://codeooo.blog.csdn.net/article/details/126891503 fart12 脱壳系统 可以脱邦邦 爱加密 企业壳 等&#xff1b; 寒冰大佬的脱壳王 本文记录下刷机过程&#xff0c;方便以后查看使用。 adb授权和ome锁要开着 代表锁是开着状态 如果出现&a…

关于标准库中的反向迭代器

什么是迭代器&#xff1f; 迭代器&#xff08;iterator&#xff09;有时又称光标&#xff08;cursor&#xff09;是程序设计的软件设计模式&#xff0c;可在容器对象&#xff08;container&#xff0c;例如list或vector&#xff09;上遍历访问的接口&#xff0c;通常来…

Ps:图框工具

图框工具 Frame Tool是自 Ps 2019 版开始新增的一个工具。 图框 Frame可用于限制图像的显示范围&#xff0c;在设计过程中&#xff0c;还常常可起到占位符的功能。 快捷键&#xff1a;K 使用图框工具&#xff0c;对于快速相册排版、创建某种形式的特效等有一定的帮助。比起使用…

ctfshow 杂项签到

ctfshow的杂项签到题&#xff0c;下载压缩包之后里面有图片。 直接将图片用010editor打开&#xff0c;检索ctfshow可以看到答案。

Frequency-domain MLPs are More EffectiveLearners in Time Series Forecasting

本论文来自于 37th Conference on Neural Information Processing Systems (NeurIPS 2023) Abstract 时间序列预测在金融、交通、能源、医疗等不同行业中发挥着关键作用。虽然现有文献设计了许多基于 RNN、GNN 或 Transformer 的复杂架构&#xff08;注意力机制的计算太占用资…

.net6使用Sejil可视化日志

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; 之前介绍了这篇.net 5使用LogDashboard_.net 5logdashboard rootpath-CSDN博客 这篇文章将会更加的简单&#xff0c;最终的效果都是可视化日志。 在程序非常庞大的时候&…

blender scripting 编写

blender scripting 编写 一、查看ui按钮对应的代码二、查看或修改对象名称三、案例&#xff1a;渲染多张图片并导出对应的相机参数 一、查看ui按钮对应的代码 二、查看或修改对象名称 三、案例&#xff1a;渲染多张图片并导出对应的相机参数 注&#xff1a;通过ui交互都设置好…

GEE数据集——USGS全球地震数据集

美国地质勘探局全球地震数据集 美国地质调查局地震灾害计划 (EHP) 提供全面的地震数据集&#xff0c;为全球监测、研究和地震防备提供宝贵资源。该数据集包含来自各种来源的地震信息&#xff0c;包括地震台、卫星图像和地面观测。持续更新&#xff0c;截至 2023 年 10 月 10 日…

跨境电商新纪元:无人驾驶技术如何颠覆物流未来

在全球化蓬勃发展的今天&#xff0c;跨境电商作为商业模式的一种新范式&#xff0c;正以前所未有的速度崛起。与此同时&#xff0c;无人驾驶技术作为物流领域的创新力量&#xff0c;正在为跨境电商带来翻天覆地的变革。本文将深入研究跨境电商新纪元下&#xff0c;无人驾驶技术…

Linux之文件目录

pwd 显示当前工作目录的绝对路径 ls显示目录中的内容 语法&#xff1a;ls [选项] 目录或文件常用选项&#xff1a; -a : 显示当前目录的所有文件和目录&#xff0c;包括隐藏的-l : 以列表的方式显示信息 cd切换目录 语法&#xff1a;cd [参数] &#xff08;切换到指定路径&…

Odoo16 实用功能之在Form视图控制字段的显示以及禁止编辑和禁止创建

目录 1、控制字段的显示 2、禁止编辑和禁止创建 1、控制字段的显示 在第一个字段没有选择的时候&#xff0c;让第二个字段不显示&#xff0c;选择之后第二个字段才显示&#xff0c;这个如何实现的&#xff1f; 以下是一个示例&#xff0c;假设disk_type是一个Selection字段&am…

数据通信网络基础华为ICT网络赛道

目录 前言&#xff1a; 1.网络与通信 2.网络类型与网络拓扑 3.网络工程与网络工程师 前言&#xff1a; 数据通信网络基础是通信领域的基本概念&#xff0c;涉及数据传输、路由交换、网络安全等方面的知识。华为ICT网络赛道则是华为公司提出的一种技术路径&#xff0c;旨在通…

python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取国债逆回购并发送QQ邮件通知

一、前言 每到年底国债逆回购的利息都会来一波高涨&#xff0c;利息会比银行的T0的理财产品的利息高&#xff0c;所以可以考虑写个脚本每天定时启动爬取逆回购数据&#xff0c;实时查看利息&#xff0c;然后在利息高位及时去下单。 二、环境搭建 详情请看《python爬虫进阶篇…

AI数字人克隆系统OEM:为未来创造更多可能

随着科技的发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域取得了重要突破。其中&#xff0c;一个备受关注的领域是AI数字人克隆系统。作为一种创新的技术&#xff0c;它引发了人们的浓厚兴趣。本文将以探秘AI数字人克隆系统OEM源码为主题&#xff0c;深入了解这…

如何从0到1搭建一个SpringBoot项目

SpringBoot是大家使用最多的一个Java框架了&#xff0c;今日就来详细介绍一下如何去创建一个SpringBoot项目 一、准备工作 首先要来看你的IDEA版本&#xff0c;如果你的IDEA是【专业版】的&#xff0c;那么你就无需安装任何的插件&#xff0c;直接就可以创建SpringBoot的项目了…

【MIMO 从入门到精通】[P4]【MIMO Communications】

前言&#xff1a; Explains the main approaches to multi-input multi-output (MIMO) communications, including Beamforming, Zero Forcing, and MMSE. * Note that at the 9:19min mark, I made a slight "voice typo", where I should have said: "you nee…

世界首款配备M.2固态硬盘的树莓派Pi 5工业计算机发布!

多年来&#xff0c;上海晶珩一直秉承创新理念&#xff0c;持续不断地推陈出新。在成功推出一系列基于树莓派 Raspberry Pi CM4 的工业计算机后&#xff0c;现推出了全球首款搭载 M.2 固态硬盘的 Raspberry Pi 5 工业计算机ED-IPC3020系列。 ED-IPC3020搭载强大的Broadcom BCM27…

交换机vlan划分方法,学会这三招就够!

你们好&#xff0c;我的网工朋友。 交换机的配置我们说过很多&#xff0c;总有一些朋友会提到vlan的划分&#xff0c;今天就给你说下具体的应用。 关于vlan的划分方法有很多&#xff0c;项目应用中较多的方法就是基于端口划分vlan、基于mac地址划分vlan、基于ip地址划分vlan……