我写了一个简单的函数来检查malloc是否有效。我创建了1 Gb数组,并用数字填充它,但是堆似乎没有变化。这是代码:
#include <stdio.h>
#include <assert.h> // For assert()
#include <stdlib.h> // For malloc(), free() and realloc()
#include <unistd.h> // For sleep()
static void create_array_in_heap()
{
double* b;
b = (double*)malloc(sizeof(double) * 1024 * 1024 * 1024);
assert(b != NULL); // Check that the allocation succeeded
int i;
for (i=0; i<1024*1024*1024; i++);
b[i] = 1;
sleep(10);
free(b);
}
int main()
{
create_array_in_heap();
return 0;
}
screenshot of Linux' system monitor
有什么想法吗?
答案 0 :(得分:3)
编辑:注释中给出了更简单的解释。但是一旦;
has been removed,我的回答就会适用。
一个积极进取的优化编译器,例如Clang(Compiler Explorer link),可以看到函数create_array_in_heap
的唯一重要部分是对sleep
的调用。其余的没有功能值,因为您只填充了一个内存块以最终将其丢弃,并被编译器删除。这是Clang 7.0.0使用-O2
编译的整个程序:
main: # @main
pushq %rax
movl $10, %edi
callq sleep
xorl %eax, %eax
popq %rcx
retq
为了对程序的任何方面进行基准测试,应将程序设计为输出结果(计算和丢弃结果对于编译器来说很容易优化为零)。还应从编译时未知的输入中计算结果,否则计算将始终产生相同的结果,并且可以通过恒定传播进行优化。