主题:求助:为结构体动态分配内存的问题
Dr_CAO_WHU
[专家分:0] 发布于 2010-07-07 11:11:00
struct PT
{
int m;
};
for( int i=0; i<1024*1024; i++ )
{
PT *pt = new PT;
}
怎么运行之后,内存加了80M?
回复列表 (共6个回复)
沙发
alweeq86 [专家分:1170] 发布于 2010-07-07 12:35:00
我win7+vs2010运行 发现少48M
所以说从任务管理器上的看结果不能代表什么
板凳
Dr_CAO_WHU [专家分:0] 发布于 2010-07-07 14:01:00
我用winXP+vc6.0的,内存增加了80M,可不知道是为什么
3 楼
eastcowboy [专家分:25370] 发布于 2010-07-07 15:34:00
这关系到系统实现。
C/C++语言有这样一个规定:如果调用exit函数,那么所有动态分配的内存都会自动被释放。所以,如果我们分配一块内存,系统会记录下来,以便在exit的时候进行释放。因为系统要记录,所以必然也是需要空间的。
假设我们分配x个字节,系统记录需要y个字节,那么总共占用的内存就是x + y个字节了。一般来说,不管我们申请的空间是大还是笑,系统记录时花费的字节数是不变的,说白了,在很多种系统中,y是一个常数,按照经验,y一般是几十个字节。
现在问题来了,如果我们分配1000个字节,那么实际消耗的内存为1000 + y,大约是一千零几十个字节,有大约1%的内存被用于系统记录。但如果我们只分配一个字节,实际消耗的内存为1 + y,大约也有几十个字节,此时多数的内存都被用于系统记录,白白的用掉了。
现在,楼主应该明白了吧?申请4个字节的空间,实际上消耗了数十个字节的内存,循环1M次,消耗掉48M或者80M的内存也就不奇怪了。
为了解决这个问题,可以用内存池技术。这种技术在对付大量分配小块内存空间时特别有效,可以大大的减少“浪费”的内存空间。
4 楼
coolwater2008 [专家分:720] 发布于 2010-07-07 18:15:00
[quote]这关系到系统实现。
C/C++语言有这样一个规定:如果调用exit函数,那么所有动态分配的内存都会自动被释放。所以,如果我们分配一块内存,系统会记录下来,以便在exit的时候进行释放。因为系统要记录,所以必然也是需要空间的。
假设我们分配x个字节,系统记录需要y个字节,那么总共占用的内存就是x + y个字节了。一般来说,不管我们申请的空间是大还是笑,系统记录时花费的字节数是不变的,说白了,在很多种系统中,y是一个常数,按照经验,y一般是几十个字节。
现在问题来了,如果我们分配1000个字节,那么实际消耗的内存为1000 + y,大约是一千零几十个字节,有大约1%的内存被用于系统记录。但如果我们只分配一个字节,实际消耗的内存为1 + y,大约也有几十个字节,此时多数的内存都被用于系统记录,白白的用掉了。
现在,楼主应该明白了吧?申请4个字节的空间,实际上消耗了数十个字节的内存,循环1M次,消耗掉48M或者80M的内存也就不奇怪了。
为了解决这个问题,可以用内存池技术。这种技术在对付大量分配小块内存空间时特别有效,可以大大的减少“浪费”的内存空间。[/quote]
晕,内存池原来是这么被引出来的哦![em6]当初在学校看Google人关于c++优化时提到内存池,硬是没入门
5 楼
强强 [专家分:4740] 发布于 2010-07-07 19:05:00
学习了
我来回复