浅谈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操作。
- 浅谈vector存储内容与空间利用
- 浅谈vector、deque与list
- 浅谈vector、deque与list
- 向量与向量空间(vector space)
- 浅谈Vector
- 浅谈进程地址空间与虚拟存储空间
- 浅谈进程地址空间与虚拟存储空间
- 浅谈进程地址空间与虚拟存储空间
- 浅谈进程地址空间与虚拟存储空间
- java 图的拓扑排序(利用Vector存储)
- java 图的拓扑排序(利用Vector存储)
- java 图的拓扑排序(利用Vector存储)
- 临近空间环境研究内容与方法
- 浅谈WebView利用localStore websql和IndexDB 来存储数据
- 浅谈Windos Azure架构与存储
- 空间数据与索引分开存储管理
- 存储介质的分区与空间分配
- 利用sql存储过程显示内容到dataGridView
- 超越竞争对手上首页SEO优化方案
- 向iOS开发者介绍C++(一)
- 如何策划一个符合seo标准的网站(详细思路)
- 去掉UITableView的Cell选中状态
- 向iOS开发者介绍C++(二)
- 浅谈vector存储内容与空间利用
- *LeetCode-Contains Duplicate III
- Java程序员常犯的10个错误
- 数据结构实践——队列数组
- notepad++使用技巧总结
- 一个计算HBase表中行数的MapReduce程序
- 黑马程序员——基础知识——数组
- 传统轮播
- POJ 3074 解题报告