【发布时间】:2013-07-22 07:59:27
【问题描述】:
我正在试验一个不断分配内存的简单 C 程序:
for ( i = 0; i < 10000; i ++ )
{
array[i] = malloc( 1024*1024 );
if ( array[i] == NULL )
{
break;
}
printf("Sleeping...%d\n", i);
sleep( 60 );
}
此处粘贴完整代码:http://tny.cz/2d9cb3df
但是,当我 cat /proc/pid/maps 时,我没有得到 [heap] 部分。为什么?
08048000-08049000 r-xp 00000000 08:11 17 /data/a.out
08049000-0804a000 r--p 00000000 08:11 17 /data/a.out
0804a000-0804b000 rw-p 00001000 08:11 17 /data/a.out
0804b000-0805e000 rw-p 00000000 00:00 0
b74c6000-b75c8000 rw-p 00000000 00:00 0
b75c8000-b7775000 r-xp 00000000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7775000-b7777000 r--p 001ad000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7777000-b7778000 rw-p 001af000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7778000-b777b000 rw-p 00000000 00:00 0
b7797000-b779a000 rw-p 00000000 00:00 0
b779a000-b779b000 r-xp 00000000 00:00 0 [vdso]
b779b000-b77bb000 r-xp 00000000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
b77bb000-b77bc000 r--p 0001f000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
b77bc000-b77bd000 rw-p 00020000 08:01 3539289 /lib/i386-linux-gnu/ld-2.17.so
bff21000-bff42000 rw-p 00000000 00:00 0 [stack]
【问题讨论】:
-
编译器推断for循环没有做任何事情(即无操作)并对其进行优化?
-
@H2CO3,我改了打印分配的地址还是一样。
-
@H2CO3 即使对于过于激进的优化编译器来说,这似乎也是一个巨大的飞跃,因为循环包含对具有相当大副作用的函数的三个调用。
-
@JoachimPileborg 好吧,是的,很公平。 (但我也看到了 GCC 和 clang 产生的“更糟糕”的优化......)
-
@Mat 代码链接已添加。