c++STL vector扩容过程

基于eBPF的procstat软件追踪C++ STL容器扩容 procstat是一款基于eBPF的监控工具软件,运行在Linux平台,主要用于跟踪目标程序的运行状态,并报告异常指标,是分析程序性能问题的一大利器。procstat软件结合前文提到的smart_stl库形成的方案能够用于追踪程序的STL容器扩容情况,实时捕捉STL扩容信息。当检测到扩容时间超过阈值的情况时,procstat会在日志中输出详细的信息,包括扩容时长、扩容次数、发生扩容的用户态堆栈等,帮助开发者快速定位问题根源。 阅读详情

扩容

底层数据结构是一个动态数组。 默认容量是0, 之后插入按照1 2 4 8 16 二倍扩容。GCC是二倍扩容,VS13是1.5倍扩容。扩容后是一片新的内存,需要把旧内存空间中的所有元素都拷贝进新内存空间中去,之后再在新内存空间中的原数据的后面继续进行插入构造新元素,并且同时释放旧内存空间,并且,由于vector 空间的重新配置,导致旧vector的所有迭代器都失效了。

vector的初始的扩容方式代价太大,初始扩容效率低, 需要频繁增长,不仅操作效率比较低,而且频繁的向操作系统申请内存容易造成过多的内存碎片,所以这个时候需要合理使用resize()和reserve()方法提高效率减少内存碎片的,需要resize()和 reserve()。

resize()

1、resize方法被用来改变vector中元素的数量,我们可以说,resize方法改变了容器的大小,且创建了容器中的对象;

2、如果resize中所指定的n小于vector中当前的元素数量,则会删除vector中多于n的元素,使vector得大小变为n;

3、如果所指定的n大于vector中当前的元素数量,则会在vector当前的尾部插入适量的元素,使得vector的大小变为n,在这里,如果为resize方法指定了第二个参数,则会把后插入的元素值初始化为该指定值,如果没有为resize指定第二个参数,则会把新插入的元素初始化为默认的初始值;

4、如果resize所指定的n不仅大于vector中当前的元素数量,还大于vector当前的capacity容量值时,则会自动为vector重新分配存储空间;

reserve():

1、reserve方法被用来重新分配vector的容量大小;

2、只有当所申请的容量大于vector的当前容量时才会重新为vector分配存储空间;小于当前容量则没有影响

3、reserve方法对于vector元素大小没有任何影响,不创建对象。

vector中数据的随机存取效率很高,O(1)的时间的复杂度,但是在vector 中随机插入元素,需要移动的元素数量较多,效率比较低。

1.5倍扩容优于2倍扩容的原因

  • 两倍扩容

    假设我们一开始申请了 16Byte 的空间。
    当需要更多空间的时候,将首先申请 32Byte,然后释放掉之前的 16Byte。这释放掉的16Byte 的空间就闲置在了内存中。
    当还需要更多空间的时候,你将首先申请 64Byte,然后释放掉之前的 32Byte。这将在内存中留下一个48Byte 的闲置空间(假定之前的 16Byte 和此时释放的32Byte 合并)
    当还需要更多空间的时候,你将首先申请128Byte,然后释放掉之前的 64 Byte。这将在内存中留下一个112Byte 的闲置空间(假定所有之前释放的空间都合并成了一个块)

扩容因子为2时,上述例子表明:每次扩容,我们释放掉的内存连接起来的大小,都小于即将要分配的内存大小。

  • 1.5倍扩容

假设我们一开始申请了 16Byte 的空间。
当需要更多空间的时候,将申请 24 Byte ,然后释放掉 16 ,在内存中留下 16Byte 的空闲空间。
当需要更多空间的时候,将申请 36 Byte,然后释放掉 24,在内存中留下 40Byte (16 + 24)的空闲空间。
当需要更多空间的时候,将申请 54 Byte,然后释放 36,在内存中留下 76Byte。
当需要更多空间的时候,将申请 81 Byte,然后释放 54, 在内存中留下 130Byte。
当需要更多空间的时候,将申请 122 Byte 的空间(复用内存中闲置的 130Byte)

C++ STL(第六篇:容器--vector) 1、概述 今天开始整理STL使用最广的容器了。同时这一部分也是我看了两遍,还有很多没有看懂的地方。最近准备硬着头皮,把这个山头给拿下,争取在第三遍能看懂吧。 容器,置物之所也。STL容器实际上就是把一些常用的数据结构给实现出来,方便大家使用。而常用的数据结构不外乎array、list、tree、stack、queue、hash table、set、map…等等。 根据 “数据在容器中的排列” 特性... 阅读详情

相关推荐

765-如何避免vector动态扩容?为什么是2倍或者1.5倍扩容?

如何避免vector动态扩容? vector的扩容机制:当向vector插入元素时,如果元素的有效个数和空间容量相等时,vector内部会自动触发扩容机制,而扩容主要分3步骤:开辟新空间,拷贝元素,释放旧空间。 但是每次扩容时,新空间的开辟不能太大,也不能太小,太大容易造成空间的浪费,太小了则会导致扩容频繁而影响程序的运行效率。 那既然扩容会影响程序的运行效率,那我们如何来避免呢? 在插入元素之前,我们可以预估vector里面要存储多少个元素,我们提前将这个空间给它开辟好就可以了!!! 比如说,我们需要向v

LINZEYU666的博客 2234

C++STL容器(一)——vector扩容和回收

面字节被问了这个问题,当时没有答上来,现在自己学习了一下做个总结 文章目录一、求容器大小的方法二、扩容的方法三、resize 和 reserve 方法1. resize()2. reserve()四、1.5倍扩容 vs 2倍扩容1. 2倍扩容2. 1.5倍扩容五、容器的回收 一、求容器大小的方法 vector<int> vc; // 定义一个 int 类型的动态数组 vc vc.size(); //返回当前 vc 元素的个数。 vc.capacity(); //返回当前 vc 中最大能够存储.

hhhcbw的博客,欢迎各位来访 7661

linux 内核vxlan收发包流程

1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p

魏言华的博客 3825

《C/C++ 面试 100 例》(四)vector 扩容策略

面试官:简单谈一下 vector 的扩容策略?

英雄哪里出来 15万+

【UE5_蓝图】实时音频采集与动态WAV文件保存实战指南

本文详细介绍了在UE5中使用蓝图实现实时音频采集与动态WAV文件保存的完整流程。从插件配置、录音框架搭建到动态文件名生成和音频参数优化,提供了实用技巧和常见问题解决方案,特别适合需要快速实现音频采集功能的开发者。

weixin_29009669的博客 407

单细胞测序数据整合

基于Seurat 联合harmony进行单细胞数据整合分析

G2530051386的博客 9789

C++ 标准模板库(STL)_序列式容器——Vector以及扩容操作(侯捷老师)

STL—— Vector容器Vector1、定义2、数据结构3、vector成倍扩容过程及部分源码3.1、扩容条件3.2、扩容步骤(3步)3.3、扩容操作部分源码( insert_aux ) ——push_back() + insert()4、vector基本用法4.1 vector容器构造函数4.2 增加函数(push_back + insert)4.3 删除函数4.4 其他常用4.5 vector常用算法参考 Vector #include<vector> 1、定义 vector占

JMW1407的博客 1481

LwIP在国产MCU的落地实践:从协议栈优化到网络稳定性实战

本文详细介绍了LwIP协议栈在国产GD32F407 MCU上的移植与优化实践,涵盖硬件平台选择、驱动适配、协议栈调优和网络稳定性提升策略。通过内存管理优化、实时操作系统集成和性能测试,为工业物联网应用提供高可靠性网络通信解决方案,显著提升数据传输效率和系统稳定性。

m2n3b4v5c6的博客 268

C++STL的vector扩容原理及实现

C++的STL中vector的扩容思想及实现 原理 C++的STL库中的vector,是一种使用很频繁的容器,因为它是一个自动扩容的容器,使用起来比较灵活,可以一直往容器的末尾添加数据。 那么它是怎么实现自动扩容的呢?其实关键点就是对于容器里的元素数量进行判断,当容器的存储数量已经达到容量时,那么就需要进行一个倍增扩容了。整体的一个扩容流程为:申请新的内存空间(空间大小为原空间的两倍或一点五倍)—> 把原空间的元素拷贝到新的空间里 —> 释放原空间 —> 数组指针指向新空间。 实现 vec

qq_45622081的博客 5305

【GD32篇】驱动AD7616完成数据采集

GD32F10X驱动AD7616完成数据采集

we_long的博客 1万+

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 196

vector源码解析及扩容优化

介绍了vector的原理并分析了其源码,对vector扩容过程中的优化进行了讨论

mrqiuwen的博客 1498

复旦微FMSH_Procise安装全流程详解:从环境配置到实战避坑指南

通过本文的全流程解析+实战技巧,开发者可快速掌握Procise在复旦微芯片开发中的核心应用。未来随着AKConv轻量级架构(参考往期文章)等创新技术的融入,国产芯片开发生态将更加完善。立即关注本专栏,获取最新多镜像切换指南与Linux SDK实战教程!扩展阅读复旦微在线升级BOOT.BIN全解析H7-TOOL实现复旦微脱机烧录(注:本文实验环境为Windows 10 x64 + FMQL45T-CORE开发板,部分操作可能因版本更新调整)立即行动下载本文配套配置文件:[GitHub链接]加入技术交流群。

QQ_778132974的博客 3232

19. C++STL 5(深入理解vector,vector的模拟实现,二维动态数组)

C++STL中vector的深入理解和模拟使用,使用vector定义二维数组

yzc的博客 1105

matlab SAR图像的多视滤波

单视复数数据(Single Look Comple)是原始的最高分辨率数据,但是从单个像元散射的雷达回波信号的相干叠加,导致强度信息有很多噪声。SAR的多视处理是对SLC数据方位向和/或距离向做平均,得到的结果是多视后的强度数据。多视处理可以提高SAR图像的信噪比,有效抑制斑点噪声,但是会降低方位分辨率。

点云侠的博客 533

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++中vector的底层机制以及size和capacity的区别

vector底层机制 vector可以看做是一个动态的数组,是一段连续的线性内存空间。 它使用3个迭代器来表示: //_Alloc 表示内存分配器,此参数几乎不需要我们关心 template <class _Ty, class _Alloc = allocator<_Ty>> class vector{ ... protected: pointer _Myfirst; pointer _Mylast; pointer _Myend; }; .

DayDayUp 3898

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

1、STL的vector使用方法

STL中vector的使用方法。先把STL库使用方法弄完。后续会有模拟实现。

2401_82911768的博客 870

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STL源码剖析——vector的实现

目录 vector的数据结构 vector的构造与析构 vector的插入与删除 vector的其他操作 reserve()与resize()的区别 vector的简单实现 vector的扩容系数 vector的数据结构 vector采用简单的线性连续空间。以两个迭代器start和end分别指向头尾,并以迭代器end_of_storage指向容量尾端。容量可能比(尾-头)还大,多...

天行健,君子以自强不息 621

【C/C++】vector 扩容要以1.5倍或者2倍的终极原因

C++ STL 中的 vector 扩容策略是以原来的1.5倍或者2倍扩容,这样的策略可以保证在平均情况下(经过大量测试),每次需要扩容的次数都是最少的,从而减少了整体的内存开销。在扩容的同时,STL 中的 vector 还会重新分配内存,把原来的数据拷贝到新的内存空间中,为了避免内存浪费,将原来的内存空间释放。C++ STL vector是一种动态数组,在存储空间不足时可以自动扩容。

Michael 590

【C++篇】揭秘STL vector:高效动态数组的深度解析

这里主要以介绍vector常用接口的方式进行讲解,由于vector的接口与过去所学的string的接口雷同,许多接口直接平移使用即可。 使用vector需包头文件: 使用格式:构造函数声明接口说明vector()(重点)无参构造vector(size_type n, const value_type& val = value_type())构造并初始化n个valvector (const vector& x)(重点)拷贝构造vector (InputIterator first, InputIterator

m0_74823364的博客 716

STL学习(自学手册+源码分析)之vector

1.1容器vector 1.1.1主体实现: template <class _Tp, class _Alloc = allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> { // requirements: __STL_CLASS_REQUIRES(_Tp, _Assignable); private: typedef _Vector_base<_Tp, _Allo

qq_33197518的博客 227

STL中vector底层实现原理

主要阐述了STL中vector容器的底层实现原理

Feeliamn的博客 218

【C++】STL--Vector使用及其模拟实现

本文介绍了C++ STL中的vector容器,包括其底层实现原理、常用接口及模拟实现。vector是动态数组,采用连续内存存储,支持高效随机访问。文章详细讲解了vector的构造方式、迭代器使用、空间管理策略(如扩容机制在VS和gcc下的差异),以及增删改查等核心操作的具体实现。通过代码示例展示了push_back、insert、erase等关键函数的实现逻辑,并提供了完整的测试用例验证功能。最后比较了不同编译环境下的扩容行为差异,帮助读者深入理解vector的内部工作机制。

小陈为梦想而生 1082

【C++】vector的内存申请机制/内部存储原理

【C++】vector的内存申请机制/内部存储原理

m0_48086806的博客 2569

【C++】深度剖析vector-带你认识vector的底层结构(万字血书)

string是C++标准模板库(STL)中用于表示字符串的类,在之前我们模拟实现string类,认识到了迭代器的使用,容器的便捷性。vector是C++标准模板库(STL)中的一种序列容器,它类似于动态数组在vector中,我们将进一步感受模版的魅力。STL六大组件有容器,迭代器,算法,适配器,仿函数,空间适配器,后续我们将一一解开面纱。vector作为一种动态数组的序列容器,让我们以后使用数组更方便也更安全。迭代器的实现和string大同小异,在下一篇文章list中,我们在感受迭代器的魅力。

2401_83251330的博客 1192
上一篇: 在C++中子类继承和调用父类的构造函数方法
下一篇: ++i、i++、i+=1、i=i+1的区别
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值