回 帖 发 新 帖 刷新版面

主题:求助:为结构体动态分配内存的问题

struct PT
{
    int m;
}; 
for( int i=0; i<1024*1024; i++ )
{
    PT *pt = new PT;
}
怎么运行之后,内存加了80M?

回复列表 (共6个回复)

沙发

我win7+vs2010运行  发现少48M
所以说从任务管理器上的看结果不能代表什么

板凳

我用winXP+vc6.0的,内存增加了80M,可不知道是为什么

3 楼

这关系到系统实现。
C/C++语言有这样一个规定:如果调用exit函数,那么所有动态分配的内存都会自动被释放。所以,如果我们分配一块内存,系统会记录下来,以便在exit的时候进行释放。因为系统要记录,所以必然也是需要空间的。
假设我们分配x个字节,系统记录需要y个字节,那么总共占用的内存就是x + y个字节了。一般来说,不管我们申请的空间是大还是笑,系统记录时花费的字节数是不变的,说白了,在很多种系统中,y是一个常数,按照经验,y一般是几十个字节。
现在问题来了,如果我们分配1000个字节,那么实际消耗的内存为1000 + y,大约是一千零几十个字节,有大约1%的内存被用于系统记录。但如果我们只分配一个字节,实际消耗的内存为1 + y,大约也有几十个字节,此时多数的内存都被用于系统记录,白白的用掉了。

现在,楼主应该明白了吧?申请4个字节的空间,实际上消耗了数十个字节的内存,循环1M次,消耗掉48M或者80M的内存也就不奇怪了。

为了解决这个问题,可以用内存池技术。这种技术在对付大量分配小块内存空间时特别有效,可以大大的减少“浪费”的内存空间。

4 楼

[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 楼

学习了

6 楼

学习了 谢谢拉

我来回复

您尚未登录,请登录后再回复。点此登录或注册