堆没有变化?

时间:2019-02-28 17:29:16

标签: c malloc

我写了一个简单的函数来检查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 screenshot of Linux' system monitor

有什么想法吗?

1 个答案:

答案 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

为了对程序的任何方面进行基准测试,应将程序设计为输出结果(计算和丢弃结果对于编译器来说很容易优化为零)。还应从编译时未知的输入中计算结果,否则计算将始终产生相同的结果,并且可以通过恒定传播进行优化。