STL究竟要占用多少内存?

sleeptilldeath 2003-09-13 01:57:40
偶使用stl容器保存大量数据时,喜欢只在容器中存放数据的指针(数据结构一般较复杂)。但发现内存使用量远远超过了新添加一些指针的空间而已。不知容器主要还在其他什么地方消耗内存,各容器对内存的消耗又有何不同?
...全文
203 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
begginginstorm 2003-09-15
  • 打赏
  • 举报
回复
看一下下面的例子:
struct Data
{
int i1;
int i2;
int i3;
int i4;
};

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
vector<Data> Coll1;
vector<int> Coll2;
cout << "InitialCapacity_Coll1:" << Coll1.capacity() << endl;
cout << "InitialCapacity_Coll2:" << Coll2.capacity() << endl;
// Coll1.reserve(129);
// Coll2.reserve(129);
for(int i = 0; i < 129; ++i)
{
Data data;
Coll1.push_back(data);
Coll2.push_back(i);
cout << i << "Capacity1:" << Coll1.capacity() << " Capacity2:" << Coll2.capacity() <<endl;
}
return 0;
}

看一下输出结果:
InitialCapacity_Coll1:0
InitialCapacity_Coll2:0
0Capacity1:1 Capacity2:1
1Capacity1:2 Capacity2:2
2Capacity1:4 Capacity2:4
3Capacity1:4 Capacity2:4
4Capacity1:8 Capacity2:8
…………
7Capacity1:8 Capacity2:8
8Capacity1:16 Capacity2:16
………………
15Capacity1:16 Capacity2:16
16Capacity1:32 Capacity2:32
……………………
31Capacity1:32 Capacity2:32
32Capacity1:64 Capacity2:64
………………
63Capacity1:64 Capacity2:64
64Capacity1:128 Capacity2:128
………………
126Capacity1:128 Capacity2:128
127Capacity1:128 Capacity2:128
128Capacity1:256 Capacity2:256

有此可知:
如果让vector自己来管理自己的保留空间,可能会造成约100%的空间浪费率,比如此例,Coll1和Coll2都申请了256个元素需要的空间,但是仅仅使用了129个。

下面将程序改动一下,取消其中的两行注释,如下:
struct Data
{
int i1;
int i2;
int i3;
int i4;
};

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
vector<Data> Coll1;
vector<int> Coll2;
cout << "InitialCapacity_Coll1:" << Coll1.capacity() << endl;
cout << "InitialCapacity_Coll2:" << Coll2.capacity() << endl;
Coll1.reserve(129);
Coll2.reserve(129);
for(int i = 0; i < 129; ++i)
{
Data data;
Coll1.push_back(data);
Coll2.push_back(i);
cout << i << "Capacity1:" << Coll1.capacity() << " Capacity2:" << Coll2.capacity() <<endl;
}
return 0;
}
执行一下,看看结果:
InitialCapacity_Coll1:0
InitialCapacity_Coll2:0
0Capacity1:129 Capacity2:129
1Capacity1:129 Capacity2:129
2Capacity1:129 Capacity2:129
3Capacity1:129 Capacity2:129
4Capacity1:129 Capacity2:129
5Capacity1:129 Capacity2:129
6Capacity1:129 Capacity2:129
7Capacity1:129 Capacity2:129
8Capacity1:129 Capacity2:129
9Capacity1:129 Capacity2:129
………………
126Capacity1:129 Capacity2:129
127Capacity1:129 Capacity2:129
128Capacity1:129 Capacity2:129

怎么样,是不是舒服了很多
总结2点:
1:如果使用vector做大数据的容器,最好能够自己使用capacity来管理保留空间,这样一来可以节约空间;二来可以减少不必要的申请空间、移动数据的操作。
2:以上测试仅仅适用于vector这种使用连续空间存储数据的容器,对于list、map等基于结点的容器应该不存在这种问题。
ttapi 2003-09-15
  • 打赏
  • 举报
回复
超大,用了 stl 就别想放到嵌入式系统上面去了。
稍微有点规模的使用stl的程序都是吃内存的大户。
TinyAnt 2003-09-14
  • 打赏
  • 举报
回复
瓶子可以装几个果子要看你果子的大小了。
neptunez 2003-09-14
  • 打赏
  • 举报
回复
是会预留,并且一般成倍的预留。即,如果他发现现在分配的不够用,就会加倍,如果再不够用,继续加倍。
loveghb 2003-09-14
  • 打赏
  • 举报
回复
容器要分配一些预留的内存。有些容器最差情况下有差不多一半的内存是暂时不用的。
有些全局、静态的函数和对象也要占内存。
如果是SGI的产品的话,memory pool本身也要占内存。
但是去除内存重新分配时的拷贝外,sgi stl速度是很快的。
Wolf0403 2003-09-14
  • 打赏
  • 举报
回复
三井正解。
积木 2003-09-14
  • 打赏
  • 举报
回复
vector 在分配内存的时候,会比当前应该使用的成员的容量稍微大一些
以防止不停的复制成员,不停的resize
mechgoukiteng 2003-09-13
  • 打赏
  • 举报
回复
stl容器分为2种

如果是vector这种内存整齐排列的容器应该不会多

但是如果是关联类型的--比如map,因为底层是rb-tree,那么肯定会大--多出3个point

所以这也是排序以后vector用2分查找会比map快的原因
firingme 2003-09-13
  • 打赏
  • 举报
回复
应该不会吧?


STL的容器设计不会这么差劲的

你贴一些你自己的代码出来看看?
mikeshi 2003-09-13
  • 打赏
  • 举报
回复
不知道你用什么容器呢?STL容器可有不少啊
dddd8888 2003-09-13
  • 打赏
  • 举报
回复
up

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧