浅谈vector存储内容与空间利用

来源:互联网 发布:js移除元素的属性值 编辑:程序博客网 时间:2024/06/06 20:31

之前做某个 project 的时候没想清楚 vector 里面存储的东西是什么,开始我还以为存的是reference,今天有时间了于是就来看看到底存了什么东西。

代码如下:

# include <iostream># include <vector>using namespace std;void main(){vector<int> vec;for (int i = 0; i < 10; i++){vec.push_back(i);}while (!vec.empty()){cout << vec.back() << endl;vec.pop_back();}system("pause");return;}

输出结果为 9 8 7 6 5 4 3 2 1 0


由此可见 vector 里面存的为数据本身。因此对于大数据来说,vector里面还是应该存pointer,对于小数据来说,直接存就好了。


那么vector的空间利用率如何呢?

通过size_of 函数,我们可以看到一个空的 vector<int>占用16byte,而一个包含10个int的vector<int>占用的空间…………怎么还是16byte!

这一定是哪里搞错了!


于是怎么就错了呢……通过调查STL源码+baidu,我们得出了这么一个结论:

vector含有四个成员变量
_A allocator;
iterator _First, _Last, _End;
是四个指针实现的
一个指针占用4个byte
4*4=16


然而这并没有解决我们的问题,我们想知道的是空间占用率,而这个解释只告诉了我们 sizeof 函数为什么会返回16。


通过visual studio调查内存我发现,

在存入int 之前,First 、Last 、 End全部存入的为空指针

在存入1个 int 之后,First 存储位置为0x00f79178,Last 存储位置为0x00f7917c, End存储位置为0x00f7917c,1个 int 共占用 4 个byte,vector存储 int 花费4个byte。

(前后分配地址不同是因为我分两次跑的)

当存入100个 int 之后,First 存储位置为0x00689c80,Last 存储位置为0x00689e10, End存储位置为0x00689eb4,100个 int 共占用 400 个byte,vector存储 int 花费564个byte。

完全释放之后,First 存储位置为0x00689c80,Last 存储位置为0x00689c80, End存储位置为0x00689eb4,0个 int 共占用 0 个byte,vector存储 int 花费564个byte。


由此可见vector是一个高空间效率的容器,存大量数据时基本不额外占用空间,但其分配内存的方式为数据超出内存分配了就重新分配double(以上)的内存(因为能存下400byte最小的2的n次方要512,而实测分配了564)。所以当处于临界情况时,其空间利用率低于50%,而当大幅减少数据后,空间占用更是不会返还给你,而是继续占用着。


综上,在大幅处理数据之后,请及时对vector进行resize操作。

在存入int 之前,First 、Last 、 End全部存入的为空指针

更正:vector用resize效率非常低,请改用swap函数
vector<int>().swap(myvector); 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信支付密码忘了怎么办 微信钱包密码忘了怎么办 忘记qq锁屏密码怎么办 微信里保密柜密码忘记了怎么办 qq漫游记录密码忘了怎么办 当你很烦的时候怎么办 当你烦的时候怎么办 面对刁蛮不讲理的老婆怎么办 老是想以前的事怎么办 被心机婊陷害了怎么办 分手了还被骚扰怎么办 苹果手机屏幕出现冷暖屏怎么办 我感觉媳妇不漂亮怎么办 90后赚不到钱怎么办 处对象感觉好累怎么办 谈朋友感觉好累怎么办 家庭条件不好娶老婆难办怎么办? 异地恋闹矛盾了怎么办 有人威胁要杀我全家怎么办 分手了借我的钱怎么办 脸打架打肿了怎么办 人家不加我qq好友怎么办 一个好友被删了怎么办 dnf脸黑怎么办还有办法 我想登别人微信怎么办 昌硕工资没到怎么办 昌硕离职不批怎么办 昌硕工资不到卡怎么办 上海人去苏州工作社保怎么办 娶个个脾气暴躁的媳妇怎么办 满脸的黑头痘痘怎么办 脚底磨起泡不敢走路怎么办 老婆老是找异性朋友怎么办 喜欢的人有对象怎么办 遇到了更喜欢的怎么办 8岁骨龄11岁怎么办啊 13岁初中生有思想不听话怎么办 交朋友找对象喜欢颜值高的怎么办 儿子找对象不听父母怎么办 缺爱怎么办的搞笑回答 对象说有人追她怎么办