关于STL,new,内存碎片

qiangv 2011-07-07 10:08:47
hi,大家好。
我现有如下问题
大概会有20W左右的数据,
该数据从文件读入,放到内存中,在内存中组织有如下几个思路
1,开辟一个连续的空间,数据条数 乘以 数据结构大小,然后填充。
2,使用map等结构,每读入一条数据,new一个机构,将指针放入map中。
3,使用map等结构,没读入一条数据,直接将结构数据拷贝给map。

我不断地new是否会存在碎片呢,我没delete,应该不会吧,直到程序over了才会delete。
1方案有个不好,就是不能插入,插入要拷贝内存,而且查找要自己实现另外的索引,才能利用折半查找什么的。


谢谢。请大家分析分析这方案。操作有增删改查。
...全文
196 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiangv 2011-07-07
  • 打赏
  • 举报
回复
OK,结贴了。谢谢各位。
mibbadman 2011-07-07
  • 打赏
  • 举报
回复
学习
wangluoqingfeng 2011-07-07
  • 打赏
  • 举报
回复
20W条不算多,用map或者hash_map都行
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 downmooner 的回复:]

重写allocator类里的2个函数就可以了
C/C++ code

void deallocate(pointer _Ptr, size_type)
{ // deallocate object at _Ptr, ignore size
m_::free((char*)_Ptr);
}

poin……
[/Quote]

好像有点明白了。先记着,后期看效果需要就重写。
downmooner 2011-07-07
  • 打赏
  • 举报
回复
重写allocator类里的2个函数就可以了

void deallocate(pointer _Ptr, size_type)
{ // deallocate object at _Ptr, ignore size
m_::free((char*)_Ptr);
}

pointer allocate(size_type _Count)
{ // allocate array of _Count elements
return (pointer)m_::alloc(_Count * sizeof(t_));
}
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pathuang68 的回复:]

引用 9 楼 qiangv 的回复:

引用 4 楼 liulcsy 的回复:

不断的new会不断的增加内存空间,另外,你是需要加锁的。

第一种方案明显是使用vector.
看看STL基础吧。

你会觉得是用list还是vector,还是map

new必然加内存。。。
vector在大数据量的后期效率太低了,要重新分配内存,然后copy内存。
我倒是纠结list和……
[/Quote]
是啊,所以到后面会存在大量的数据重新分配内存,然后拷贝内存。所以我方案一是自己管理,一开始就分配够内存。
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dizuo 的回复:]

引用楼主 qiangv 的回复:
hi,大家好。
我现有如下问题
大概会有20W左右的数据,
该数据从文件读入,放到内存中,在内存中组织有如下几个思路
1,开辟一个连续的空间,数据条数 乘以 数据结构大小,然后填充。
2,使用map等结构,每读入一条数据,new一个机构,将指针放入map中。
3,使用map等结构,没读入一条数据,直接将结构数据拷贝给map。

我不断地new是……
[/Quote]

我现在用的也是方案2,map内部使用RBT,增删改查到效率应该不低,尤其查找,好像是最高的了。
pathuang68 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qiangv 的回复:]

引用 4 楼 liulcsy 的回复:

不断的new会不断的增加内存空间,另外,你是需要加锁的。

第一种方案明显是使用vector.
看看STL基础吧。

你会觉得是用list还是vector,还是map

new必然加内存。。。
vector在大数据量的后期效率太低了,要重新分配内存,然后copy内存。
我倒是纠结list和map,list要索引,然后自己实现折半查找……
[/Quote]
vector超过capacity的时候,才会增加内存。
ryfdizuo 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 qiangv 的回复:]
hi,大家好。
我现有如下问题
大概会有20W左右的数据,
该数据从文件读入,放到内存中,在内存中组织有如下几个思路
1,开辟一个连续的空间,数据条数 乘以 数据结构大小,然后填充。
2,使用map等结构,每读入一条数据,new一个机构,将指针放入map中。
3,使用map等结构,没读入一条数据,直接将结构数据拷贝给map。

我不断地new是否会存在碎片呢,我没delete,应该……
[/Quote]
方案2好了,map的增删改,查找 都是log(n)啊
pathuang68 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qiangv 的回复:]

引用 1 楼 babilife 的回复:

操作有增删改查

。。。。。。。那用list效率会更好


list的话我要自己维护索引列表,才会提高查找的效率。
很难取舍
[/Quote]

没有任何一种容器,拥有全部的优点而没有缺点。你根据自己实际的情况在STL中的list,vector或者map中选一个吧。

用STL的容器,你不用担心内存碎片。另外20w的数据对STL的容器来说是小case,也不用担心。
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liulcsy 的回复:]

不断的new会不断的增加内存空间,另外,你是需要加锁的。

第一种方案明显是使用vector.
看看STL基础吧。

你会觉得是用list还是vector,还是map
[/Quote]
new必然加内存。。。
vector在大数据量的后期效率太低了,要重新分配内存,然后copy内存。
我倒是纠结list和map,list要索引,然后自己实现折半查找,map就轻松,嘿嘿。
healer_kx 2011-07-07
  • 打赏
  • 举报
回复
http://blog.csdn.net/lifesider/article/details/6527788

参考这个,内存由你控制了。
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 healer_kx 的回复:]

stl的内存分配机制还是不错的,不用太担心20w条。

大不了你可以重写 模板参数, Allocator。
[/Quote]

主要对这个不熟悉,这几天才看到这个功能。
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q191201771 的回复:]

频繁new delete才会出现 碎片
[/Quote]
我也是这么觉得。就是来找各位确认的。
qiangv 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 babilife 的回复:]

操作有增删改查

。。。。。。。那用list效率会更好
[/Quote]

list的话我要自己维护索引列表,才会提高查找的效率。
很难取舍
科比布莱恩特 2011-07-07
  • 打赏
  • 举报
回复
不断的new会不断的增加内存空间,另外,你是需要加锁的。

第一种方案明显是使用vector.
看看STL基础吧。

你会觉得是用list还是vector,还是map
healer_kx 2011-07-07
  • 打赏
  • 举报
回复
stl的内存分配机制还是不错的,不用太担心20w条。

大不了你可以重写 模板参数, Allocator。
就想叫yoko 2011-07-07
  • 打赏
  • 举报
回复
频繁new delete才会出现 碎片
至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复
操作有增删改查

。。。。。。。那用list效率会更好

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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