list lst; 200000万次lst.pushback(0),用了7M内存,而 new long(200000)来用了700K内存,为什么。是我不会用stl,还是它本来就耗内

wd_6532 2006-02-19 08:54:54
list<long> lst; 200000万次lst.pushback(0),用了7M内存,而 new long(200000)来用了700K内存,为什么。是我不会用stl,还是它本来就耗内存
...全文
348 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aizz 2006-05-27
  • 打赏
  • 举报
回复
To AthlonxpX86(桃源村):

>我老早就不喜欢用stl,在windows上简直属于垃圾库,微软都不建议使用它,没任何效率,
>兼容性稳定性都差到底了,而且语法还搞不懂,

看你有两颗星,似乎应该用的不是 VC6 的那个垃圾版本的 STL 吧,如果是,我沉默。
看看 STL 里面的东西吧,值得学习的东西挺多的。至于微软,你没看到 VC7 里面又有了新的 STL 了吗,如果垃圾 M$ 会费钱继续支持并不断改进?
至于搞不懂语法,似乎与 STL 是否优秀无关吧,你说是吗?

>程序中最好不要大量使用new,不但速度慢占内存而且还不稳定,造成出错概率增大,能自
>己管理内存最好自己管理,
这个我同意,当然如果能针对性的实现对 new 的重载,这个问题就不是问题了。
fatacy 2006-05-27
  • 打赏
  • 举报
回复
mark
wd_6532 2006-05-27
  • 打赏
  • 举报
回复
stl已经是一种标准,也就是仅仅定义函数或者类的接口和功能。实现有很多版本,
比如我也可以写一个stl库,但是微软不会采用我的了。

vc不同版本采用的stl库可能是不一样的。
believefym 2006-05-27
  • 打赏
  • 举报
回复
看你有两颗星,似乎应该用的不是 VC6 的那个垃圾版本的 STL 吧,如果是,我沉默。
看看 STL 里面的东西吧,值得学习的东西挺多的。至于微软,你没看到 VC7 里面又有了新的 STL 了吗,如果垃圾 M$ 会费钱继续支持并不断改进?
至于搞不懂语法,似乎与 STL 是否优秀无关吧,你说是吗?
-----------
STL难道还跟VC的版本有关?
heroboy2000 2006-04-09
  • 打赏
  • 举报
回复
为什么是十倍?
=========
因为list中的每个节点都是new出来的,每次new都有内存的损耗的
wd_6532 2006-04-09
  • 打赏
  • 举报
回复
allocator太苦涩。
wd_6532 2006-04-09
  • 打赏
  • 举报
回复
不知道有allocator吗?
不知道new可以重载吗?
不知道不同STL有不同的实现吗?
====================
是知道有,也想用,可是太苦涩了。一直没有搞明白。
wd_6532 2006-04-09
  • 打赏
  • 举报
回复
晕,我还打算学STL呢,现在听你这么一说,是不是没有必要学STL了?
=====================
在win上学会了,到linux上也可以用。
而且算法也很多实用的,就算效率差,如果满足需求,也不用自己编写了。
whwjn 2006-04-09
  • 打赏
  • 举报
回复
AthlonxpX86(桃源村)
晕,我还打算学STL呢,现在听你这么一说,是不是没有必要学STL了?
heroboy2000 2006-04-09
  • 打赏
  • 举报
回复
lst.pushback每次都要new,不能自己管理内存
=======================================
不知道有allocator吗?
不知道new可以重载吗?
不知道不同STL有不同的实现吗?
AthlonxpX86 2006-04-09
  • 打赏
  • 举报
回复
lst.pushback每次都要new,不能自己管理内存
我老早就不喜欢用stl,在windows上简直属于垃圾库,微软都不建议使用它,没任何效率,兼容性稳定性都差到底了,而且语法还搞不懂,程序中最好不要大量使用new,不但速度慢占内存而且还不稳定,造成出错概率增大,能自己管理内存最好自己管理,
你把new long(200000)改成
for(int i=0;i<200000,i++)
{
char * p=new char[1];
}
运行看看你就知道什么问题了,我以前写过new的一个windows上的测试资料
release版(debug版本的new还不一样)
new一次至少要占用24字节(多次分配还会有其他字节分配),其中16字节是给你分配的最小内存块单位,8字节是new自己的C内存管理给自己分配的,用来在纪录内存分配信息,以便delete的时候根据这个信息删除释放内存,所以就有new char[1];的实际内存占用量和new char[16];是一样的,new char[17];分配给你的内存则等于new char[32];
这样来计算list<long>的内存浪费量比例则可以这样算
(24-4)/24=5/6,大约83%的内存就白白浪费在new上了

debug版
new一次至少要占用56字节(多次分配还会有其他字节分配),其中12字节是给你分配的最小内存块单位,44字节是new自己的C内存管理给自己分配的,用来在纪录内存分配信息,以便delete的时候根据这个信息删除释放内存,所以就有new char[1];的实际内存占用量和new char[12];是一样的,new char[13];分配给你的内存则等于new char[24];
这样来计算list<long>的内存浪费量比例则可以这样算
(56-4)/56=13/14,大约92%的内存就白白浪费在new上了
AthlonxpX86 2006-04-09
  • 打赏
  • 举报
回复
lst.pushback每次都要new,不能自己管理内存
我老早就不喜欢用stl,在windows上简直属于垃圾库,微软都不建议使用它,没任何效率,兼容性稳定性都差到底了,而且语法还搞不懂,程序中最好不要大量使用new,不但速度慢占内存而且还不稳定,造成出错概率增大,能自己管理内存最好自己管理,
你把new long(200000)改成
for(int i=0;i<200000,i++)
{
char * p=new char[1];
}
运行看看你就知道什么问题了,我以前写过new的一个windows上的测试资料
release版(debug版本的new还不一样)
new一次至少要占用24字节(多次分配还会有其他字节分配),其中16字节是给你分配的最小内存块单位,8字节是new自己的C内存管理给自己分配的,用来在纪录内存分配信息,以便delete的时候根据这个信息删除释放内存,所以就有new char[1];的实际内存占用量和new char[16];是一样的,new char[17];分配给你的内存则等于new char[32];
这样来计算list<long>的内存浪费量比例则可以这样算
(24-4)/24=5/6,大约83%的内存就白白浪费在new上了

release版()
new一次至少要占用56字节(多次分配还会有其他字节分配),其中12字节是给你分配的最小内存块单位,44字节是new自己的C内存管理给自己分配的,用来在纪录内存分配信息,以便delete的时候根据这个信息删除释放内存,所以就有new char[1];的实际内存占用量和new char[12];是一样的,new char[13];分配给你的内存则等于new char[24];
这样来计算list<long>的内存浪费量比例则可以这样算
(56-4)/56=13/14,大约92%的内存就白白浪费在new上了
sevencat 2006-04-08
  • 打赏
  • 举报
回复
可能跟crt的小内存池分配有关吧?有人仔细研究一下,贴一下就好了。
LookSail 2006-04-08
  • 打赏
  • 举报
回复
new long(200000)

200000 * 4BYTE /1024 =781.25 KB
FengYuanMSFT 2006-04-08
  • 打赏
  • 举报
回复
为什么是十倍?

long 4 bytes
ptr 4 bytes
ptr 4 bytes
overhead 8 bytes (?)
20 bytes

align to 16 byte boundary = 24 bytes, 六倍.

不会是 64 位吧?
LookSail 2006-04-08
  • 打赏
  • 举报
回复
楼主是用什么检测内存占用的精确数字的?
wd_6532 2006-04-08
  • 打赏
  • 举报
回复
为什么是十倍?
=========
你在自己机器上试试?

我是在任务管理器看进程占用的内存的。
那个程序除了循环20万次,什么都不干。
wlwlxj 2006-04-08
  • 打赏
  • 举报
回复
stl容器用来对数据操作方便,如果只是存储,自己new一块
xhzxlqt 2006-04-08
  • 打赏
  • 举报
回复
鱼与熊掌的关系
sevencat 2006-04-08
  • 打赏
  • 举报
回复
std::list是双向链表,插一个值的时候起码增加两个ptr的空间。
加载更多回复(6)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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