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

之前做某个 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); 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值