关于内存分配与高效使用内存

starnight1981 2013-01-17 10:52:12
有个结构体
struct temp
{
int a;
int b;
}

这个结构体大小是8个字节。

现在在程序中new 100万个 这个结构体对象
int main
{
int i=0;
while(++i<=1000000)
{
temp *p = new temp;
}

std::cin>>i;
}

程序运行到 std::cin>>i; 这行的时候, 已经new 完 了100万个这个结构体对象了。 按道理, 100万个所占的内存应该是 8000000 字节,也就是8m左右,但是看进程,这个进程的内存占用差不多是80M了。

谁能解释一下 这个原因吗?
...全文
280 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenkang_apple123 2013-01-19
  • 打赏
  • 举报
回复
如果是要分配连续内存,建议使用 char* a = new char[1000];
eagleatustb 2013-01-18
  • 打赏
  • 举报
回复
引用 11 楼 starnight1981 的回复:
引用 7 楼 eagleatustb 的回复:根据在vs2008下测试,楼主所说的占80M左右是在debug调试情况下占的内存大小,在release情况下占大约16.6M,这个情况可以用debug和release所使用的new分配内存方式不一样来解释。release情况下分配8字节空间需要8字节内存,而debug情况下分配8字节空间需要44字节内存,5倍多一点,和80/1……
应该和编译环境的编译配置有关系,也和你本身机器的CPU位数,windows运行版本有关,可以使用别的编译器做测试。
starnight1981 2013-01-18
  • 打赏
  • 举报
回复
引用 7 楼 eagleatustb 的回复:
根据在vs2008下测试,楼主所说的占80M左右是在debug调试情况下占的内存大小,在release情况下占大约16.6M,这个情况可以用debug和release所使用的new分配内存方式不一样来解释。release情况下分配8字节空间需要8字节内存,而debug情况下分配8字节空间需要44字节内存,5倍多一点,和80/16一致——可以跟踪进new源代码看。 另外一……
我是在vs2010 下做的, release就占用了80,debug 更多。
starnight1981 2013-01-17
  • 打赏
  • 举报
回复
引用 2 楼 starnight1981 的回复:
引用 1 楼 lile1234_show 的回复:.exe启动所占用的内存,不仅仅只有你分配的堆内存大小。 知道,假设不分配这100完个对象,exe启动后所占内存 仅仅只有几十kb。
你可写个程序对比一下, new 这100万个对象,和不new 这100万个对象,内存占用差别有10来倍。
漫步者、 2013-01-17
  • 打赏
  • 举报
回复
引用 楼主 starnight1981 的回复:
有个结构体 struct temp { int a; int b; } 这个结构体大小是8个字节。 现在在程序中new 100万个 这个结构体对象 int main { int i=0; while(++i<=1000000) { temp *p = new temp; } std::cin>>i……
你的进程所占内存大小,不是仅有你的new出来的对象才占有,你要想一下,代码段,数据段,bbs段等中的数据都是要占内存的。
starnight1981 2013-01-17
  • 打赏
  • 举报
回复
引用 1 楼 lile1234_show 的回复:
.exe启动所占用的内存,不仅仅只有你分配的堆内存大小。
知道,假设不分配这100完个对象,exe启动后所占内存 仅仅只有几十kb。
lee_鹿游原 2013-01-17
  • 打赏
  • 举报
回复
.exe启动所占用的内存,不仅仅只有你分配的堆内存大小。
armsword 2013-01-17
  • 打赏
  • 举报
回复
7L解释的不错。
eagleatustb 2013-01-17
  • 打赏
  • 举报
回复
引用 7 楼 eagleatustb 的回复:
根据在vs2008下测试,楼主所说的占80M左右是在debug调试情况下占的内存大小,在release情况下占大约16.6M,这个情况可以用debug和release所使用的new分配内存方式不一样来解释。release情况下分配8字节空间需要8字节内存,而debug情况下分配8字节空间需要44字节内存,5倍多一点,和80/16一致——可以跟踪进new源代码看。 另外一……
上面第一段中“release情况下分配8字节空间需要8字节内存,”表述错误,我是边测边写的。应该为“release情况下分配8字节空间需要16字节内存”。而debug下占80M内存应该和调试所需要的资源有关。
赵4老师 2013-01-17
  • 打赏
  • 举报
回复
操作系统管理每块内存需要额外的字节。 temp **p = new temp[1000000];
eagleatustb 2013-01-17
  • 打赏
  • 举报
回复
根据在vs2008下测试,楼主所说的占80M左右是在debug调试情况下占的内存大小,在release情况下占大约16.6M,这个情况可以用debug和release所使用的new分配内存方式不一样来解释。release情况下分配8字节空间需要8字节内存,而debug情况下分配8字节空间需要44字节内存,5倍多一点,和80/16一致——可以跟踪进new源代码看。 另外一方面,现在需要解释为什么8M字节空间需要占16M的内存,release情况下,我跟踪看到的分配内存情况使用的代码是: if (size == 0) size = 1; size = (size + BYTES_PER_PARA - 1) & ~(BYTES_PER_PARA - 1); return HeapAlloc(_crtheap, 0, size); 而BYTES_PER_PARA = 16,也就是说分配8字节空间时向16字节对齐。 我使用struct temp { int a; int b; } 和 struct temp { int a; } 在release下申请10万个对象,上面的情况占2562K内存,下面的情况点2560K内存。可以看成是一样的。就是因为win32情况下系统new申请对象大小时默认对齐到16个字节了。 我想这应该能解答清楚这个问题了。
Enter空格 2013-01-17
  • 打赏
  • 举报
回复
你每次都这样创建一个temp *p = new temp; 这样的内存中间是不连贯的 会有很多碎片在里面
Enter空格 2013-01-17
  • 打赏
  • 举报
回复
你这样做试试。 new temp[1000000];

64,637

社区成员

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

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