C++ STL中vector的内存机制和性能分析
vecotr是动态数组,顾名思义他可以动态的增加自己的长度。
内存机制:
但是怎样的增加自己的长度?
vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返回当前数组中数的数量。vector增加元素来说,当容量已经不能放进数据了,那么他会重新申请一块内存,把之前的内存利用复制构造函数复制到新的内存当中,然后把新添加的内容放入后面,另外此时的他申请的内存空间是原来空间的2倍,我测得是2倍
缓冲区的释放
vecotor占用的内存只增不减,erase只是将一段区间( earse(arr.begin(), arr.end() )的值清除掉或者将某个值( erase(x) )清除掉,但是对于内存空间来说是没变化的
所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。
方法一:
vecotr<Type>().swap(arr) // 回收arr内存
方法二:
模板:
Template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}
调用模板函数
void ClearVector<vector< T> & vt)
{
vector<int> temp;//临时对象未初始化,其缓冲区大小为0,没有数据
arr.swap(temp);//与我们的对象交换数据,arr的缓冲区就没了。
}//临时变量会被析构,temp调用vector析构函数释放空间
----------------------------------------------------------------------------
性能分析:
主要比较三种插入方式:
1、直接push_back() 2、 reserve(n) 预定n个空间,当然后续push_back()会增加,其中的值不确定, 3 resize(n, x) 申请n个空间初始化为x,
reserve只是保持一个最小的空间大小,而resize则是对缓冲区进行重新分配,里面涉及到的判断和内存处理比较多所以比reserve慢一些,对于数据数目可以确定的时候,先预设空间大小是很有必要的。直接push_back数据频繁移动很是耗时
C++ STL中vector的内存机制和性能分析的更多相关文章
- 【C++】vector内存机制和性能分析
转自:https://blog.csdn.net/mfcing/article/details/8746256 一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用 ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1 ...
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jma ...
- 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可 如果想把 ...
- C++ STL中vector(向量容器)使用简单介绍
原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...
- 解析STL中典型的内存分配
1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么? 在c++中vector是非常类似数组,但是他比数组更加灵活,这就表现在他的大小是可以自 ...
随机推荐
- 基于canvas实现物理运动效果与动画效果(一)
一.为什么要写这篇文章 某年某月某时某种原因,我在慕课网上看到了一个大神实现了关于小球的抛物线运动的代码,心中很是欣喜,故而写这篇文章来向这位大神致敬,同时也为了弥补自己在运动效果和动画效果制作方面的 ...
- Bootstrap系列 -- 9. 表格
一. Bootstrap 表格样式支持 Bootstrap提供了六种不同风格的样式支持,其中一个基础样式,4个附件样式,1个响应式设计样式 1. .table:基础表格 2. .table-strip ...
- Intent和Intent Filters
什么是Intent Intent是android开发中的重要对象,它作为一个信息承载对象存在. 我们可以在使用其他一些组件的时候从Intent获取行为响应的准则(即应该做什么东西,如何 ...
- Maven的set.xml标签详解
文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...
- win7远程桌面连接不上,解决办法
来源于:http://jingyan.baidu.com/article/39810a23edc48bb637fda672.html 一般情况下,对WIN7的远程连接只需要5步即可完成远程连接的设置: ...
- react.js 表单验证-登录框
import React,{ Component } from 'react'; import style from 'cms.css'; /** * 路由路径 登录成功后页面跳转到index * ...
- react 属性与状态 学习笔记
知识点:1.react 属性的调用 this.props.被调用的属性名 设置属性的常用方法:var props = { one: '123', two: 321}调用这个属性:<HelloWo ...
- 查看本机ip
视窗+R 然后输入cmd, enter 后再黑色窗口里输入 ipconfig
- mysql-异常Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1
这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 网上摘抄的问题解决方案:http:// ...
- epon e8-c HG220GS超级密码破解
网上找了很多管理电信e8-c的破解资料,大多都是明文密码,而hg220gs则为加密的密码,找来找去最后终于找到加密方式了base64,真心不容易 下面从其他博文中转载过来留着记录 低端hack.主要是 ...