C++ vector内存分配机制
C++ vector其实就相当于动态数组,它的内存会随着size的增加而不断的增长。
vector有两个函数,一个是capacity(),返回对象缓冲区(vector维护的内存空间)实际申请的空间大小,另一个size(),返回当前对象缓冲区存储数据的个数。对于vector来说,capacity是永远大于等于size的,档capacity和size相等时,vector就会扩容,capacity变大。
比如vector最常用的push_back操作,它的整个过程是怎么一个机制呢?
在调用push_back时,若当前容量(capacity)已经不能够容纳新的元素,即此时capacity=size,那么vector会重新申请一块内存,把之前的内存里的元素拷贝到新的内存当中,然后把push_back的元素拷贝到新的内存中,最后要析构原有的vector并释放原有的内存。这个过程的效率是极低的,为了避免频繁的分配内存,C++每次申请内存一般都会成倍的增长,例如之前是4,那么重新申请后就是8,以此类推。
下面通过一个实例来验证整个过程:
#include <vector>
#include <iostream>
using namespace std; class Test
{
public: Test(char c): m(c) { cout << "construction" << " " << m << endl; } Test(const Test& p): m(p.m) { cout << "copy construction" << " " << p.m << endl; } ~Test() { cout << "destruction" << " " << m << endl; }int m;
}; int main()
{ Test test[10] = {0,1,2,3,4,5,6,7,8,9}; cout << "**************************" << endl; vector<Test> arr; for (int i = 0; i < 10; i++) { cout << "~ ~ ~ ~ ~ ~" << endl; arr.push_back(test[i]); cout << "capacity=" << arr.capacity() << ",size=" << arr.size() << endl; cout << "--------------------------" << endl; }//test[0].m = 100; cout << "...end..." << endl; }
运行结果:
construction 0
construction 1
construction 2
construction 3
construction 4
construction 5
construction 6
construction 7
construction 8
construction 9
**************************
~ ~ ~ ~ ~ ~
copy construction 0
capacity=1,size=1
--------------------------
~ ~ ~ ~ ~ ~
copy construction 1
copy construction 0
destruction 0
capacity=2,size=2
--------------------------
~ ~ ~ ~ ~ ~
copy construction 2
copy construction 0
copy construction 1
destruction 0
destruction 1
capacity=4,size=3
--------------------------
~ ~ ~ ~ ~ ~
copy construction 3
capacity=4,size=4
--------------------------
~ ~ ~ ~ ~ ~
copy construction 4
copy construction 0
copy construction 1
copy construction 2
copy construction 3
destruction 0
destruction 1
destruction 2
destruction 3
capacity=8,size=5
--------------------------
~ ~ ~ ~ ~ ~
copy construction 5
capacity=8,size=6
--------------------------
~ ~ ~ ~ ~ ~
copy construction 6
capacity=8,size=7
--------------------------
~ ~ ~ ~ ~ ~
copy construction 7
capacity=8,size=8
--------------------------
~ ~ ~ ~ ~ ~
copy construction 8
copy construction 0
copy construction 1
copy construction 2
copy construction 3
copy construction 4
copy construction 5
copy construction 6
copy construction 7
destruction 0
destruction 1
destruction 2
destruction 3
destruction 4
destruction 5
destruction 6
destruction 7
capacity=16,size=9
--------------------------
~ ~ ~ ~ ~ ~
copy construction 9
capacity=16,size=10
--------------------------
...end...
destruction 0
destruction 1
destruction 2
destruction 3
destruction 4
destruction 5
destruction 6
destruction 7
destruction 8
destruction 9
destruction 9
destruction 8
destruction 7
destruction 6
destruction 5
destruction 4
destruction 3
destruction 2
destruction 1
destruction 100
C++ vector内存分配机制相关推荐
- STL中Vector的内存分配机制
一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析.今天看了下相关文章,也写了几个小的测试程序跑了跑.算是总结下,希望对需要的 ...
- c++ vector查找_C++ vector内存分配策略浅析
(给CPP开发者加星标,提升C/C++技能) 来源:邱国禄https://blog.csdn.net/qiuguolu1108/article/details/107146184 vector是一个封 ...
- MySQL • 源码分析 • 内存分配机制
摘要: 前言 内存资源由操作系统管理,分配与回收操作可能会执行系统调用(以 malloc 算法为例,较大的内存空间分配接口是 mmap, 而较小的空间 free 之后并不归还给操作系统 ),频繁的系统 ...
- JAVA入门级教学之(方法内存分配机制)
目录 JAVA入门级教学之(方法内存分配机制) 1.方法只定义,不调用,是不会执行的 2.在JVM内存划分上有这样三块主要的内存空间:[还有其它的内存空间] 3.关于"栈"数据结构 ...
- 谈谈 HashMap(int initialCapacity)与内存分配机制
前言 阅读前请先看看如下几个问题,如果有不清楚的地方看完本文会有收获 关于扩容相关原理与一些巧妙的二进制算法分析参考HashMap巧妙的扩容算法 HashMap(int initialCapacity ...
- 32g内存 java开发,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧...
内存分配机制 逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被 ...
- Java 虚拟机内存分配机制
Java 虚拟机内存分配机制 内存区域划分 对于大多数的程序员来说,Java 内存比较流行的说法便是堆和栈,这其实是非常粗略的一种划分,这种划分的"堆"对应内存模型的 Java 堆 ...
- linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB
Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...
- C++ vector 内存分配与回收机制
原文出处:http://blog.csdn.net/qq_30835655/article/details/60762196 最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点.这 ...
最新文章
- 如何创建从ArcIMS到ArcSDE/Oracle的直接连接?
- Springboot 抛出Failed to determine a suitable driver class异常原因
- python scrapy框架原理_Scrapy框架的工作原理是什么?
- 【计算机网络】网络安全 : 公钥分配 ( 公钥使用者 | 公钥分配 | CA 证书格式 | CA 证书吊销 )
- 攻防世界-hit-the-core(简单详细)
- 关于SQL的几个备忘
- MySQL 使用 LOAD DATA 导入 csv 文件
- Struts 学习笔记2(输入校验、国际化、异常处理)
- 【C++深度剖析教程13】函数对象的分析
- 为什么安装了cmpp没法拖到工具栏_软件SU:简介、安装以及设置
- 统计学基础学习笔记:正态分布
- Udp通信 暑期学习笔记(三)
- java ee课程目标
- <HTML>简单登录页面代码
- C++--数字转大写金额
- Table ‘xxx‘ is specified twice, both as a target for ‘UPDATE‘ and as a separate source for data
- android面试题分析总结
- 4.11交叉验证——K-fold和Stratified k-fold
- 2019 FeatherNets: Convolutional Neural Networks as Light as Feather for Face Anti-spoofing
- python人脸识别表情检测器(2):基本框架的制作