Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108886
  • 博文数量: 7
  • 博客积分: 1527
  • 博客等级: 上尉
  • 技术积分: 510
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-18 11:46
文章分类

全部博文(7)

文章存档

2011年(1)

2009年(1)

2008年(5)

分类: C/C++

2008-09-10 10:42:52

VECTOR的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。
vector为了防止大量分配连续内存的开销,
保持一块默认的尺寸的内存,clear只是清数据了
未清内存,因为vector的capacity容量未变化,系统维护一个的默认值

有什么方法可以释放掉vector中占用的全部内存呢?

标准的解决方法如下
template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}

事实上,vector根本就不管内存,它只是负责向内存管理框架acquire/release内存,内存管理框架如果发现内存不够了,就malloc,但是当vector释放资源的时候(比如destruct), stl根本就不调用free以减少内存,因为内存分配在stl的底层:stl假定如果你需要更多的资源就代表你以后也可能需要这么多资源(你的list, hashmap也是用这些内存),所以就没必要不停地malloc/free。 如果是这个逻辑的话这可能是个trade-off

一般的STL内存管理器allocator都是用内存池来管理内存的,所以某个容器申请内存或释放内存都只是影响到内存池的剩余内存量,而不是真的把内存归还给系统。这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率——不用每次都在系统内存里寻找一番。
真的让容器把不用的内存归还给系统的话,只能自己写一个allocator,并在容器的模板参数里使用它,而且STL的标准容器确实都留了这个接口。
不过要意识到这样做给程序性能和系统内存带来的影响。

clear和erase可以很好地减少了vector的大小(size),但没有减少它的容量(capactiy)

《STL源码剖析》《effective STL》,《深入剖析STL》值得一读

阅读(2205) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~