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内存分配机制相关推荐

  1. STL中Vector的内存分配机制

    一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析.今天看了下相关文章,也写了几个小的测试程序跑了跑.算是总结下,希望对需要的 ...

  2. c++ vector查找_C++ vector内存分配策略浅析

    (给CPP开发者加星标,提升C/C++技能) 来源:邱国禄https://blog.csdn.net/qiuguolu1108/article/details/107146184 vector是一个封 ...

  3. MySQL • 源码分析 • 内存分配机制

    摘要: 前言 内存资源由操作系统管理,分配与回收操作可能会执行系统调用(以 malloc 算法为例,较大的内存空间分配接口是 mmap, 而较小的空间 free 之后并不归还给操作系统 ),频繁的系统 ...

  4. JAVA入门级教学之(方法内存分配机制)

    目录 JAVA入门级教学之(方法内存分配机制) 1.方法只定义,不调用,是不会执行的 2.在JVM内存划分上有这样三块主要的内存空间:[还有其它的内存空间] 3.关于"栈"数据结构 ...

  5. 谈谈 HashMap(int initialCapacity)与内存分配机制

    前言 阅读前请先看看如下几个问题,如果有不清楚的地方看完本文会有收获 关于扩容相关原理与一些巧妙的二进制算法分析参考HashMap巧妙的扩容算法 HashMap(int initialCapacity ...

  6. 32g内存 java开发,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧...

    内存分配机制 逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被 ...

  7. Java 虚拟机内存分配机制

    Java 虚拟机内存分配机制 内存区域划分 对于大多数的程序员来说,Java 内存比较流行的说法便是堆和栈,这其实是非常粗略的一种划分,这种划分的"堆"对应内存模型的 Java 堆 ...

  8. linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB

    Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...

  9. C++ vector 内存分配与回收机制

    原文出处:http://blog.csdn.net/qq_30835655/article/details/60762196 最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点.这 ...

最新文章

  1. 如何创建从ArcIMS到ArcSDE/Oracle的直接连接?
  2. Springboot 抛出Failed to determine a suitable driver class异常原因
  3. python scrapy框架原理_Scrapy框架的工作原理是什么?
  4. 【计算机网络】网络安全 : 公钥分配 ( 公钥使用者 | 公钥分配 | CA 证书格式 | CA 证书吊销 )
  5. 攻防世界-hit-the-core(简单详细)
  6. 关于SQL的几个备忘
  7. MySQL 使用 LOAD DATA 导入 csv 文件
  8. Struts 学习笔记2(输入校验、国际化、异常处理)
  9. 【C++深度剖析教程13】函数对象的分析
  10. 为什么安装了cmpp没法拖到工具栏_软件SU:简介、安装以及设置
  11. 统计学基础学习笔记:正态分布
  12. Udp通信 暑期学习笔记(三)
  13. java ee课程目标
  14. <HTML>简单登录页面代码
  15. C++--数字转大写金额
  16. Table ‘xxx‘ is specified twice, both as a target for ‘UPDATE‘ and as a separate source for data
  17. android面试题分析总结
  18. 4.11交叉验证——K-fold和Stratified k-fold
  19. 2019 FeatherNets: Convolutional Neural Networks as Light as Feather for Face Anti-spoofing
  20. python人脸识别表情检测器(2):基本框架的制作

热门文章

  1. 年轻人频繁辞职的主要原因是什么呢?
  2. 华裔科学家张首晟:个人数据完全由个人拥有
  3. python 使用爬虫下载京东图片
  4. 双位置继电器ST2-2L/AC220V
  5. 在linux下使用debugfs恢复rm删除的文件
  6. excel使用教程_Excel 有多强大?你用 Excel 做的最酷的事情是什么?
  7. JFrog Artifactory的数据备份与恢复教程
  8. CentOS支持中文
  9. 黑马程序员—GUI(菜单)小例子
  10. 怎么样去申请免费的云主机