编译器优化会影响动态内存分配吗?

拉姆丁·穆萨维(Ramtin Mousavi)

我知道有时候编译器会删除未使用的数组。

但是我的问题是对使用malloc分配的动态变量或只是堆栈变量有影响吗?

malloc是编译时操作还是运行时?

如果是运行时,编译器可以删除使用malloc分配的数组,还是只能删除固定大小的数组?

用户名

允许删除编译器malloc及其系列,因为内存分配不是可观察到的行为。

例如,将gcc和都clang 优化为仅return 42使用以下命令-O2

int foo(){
    malloc(10);
    return 42;
}

int bar(){
    int* p = (int*)malloc(10);
    *p = 17;
    return 42;
}

int qax(){
    int* p = (int*)malloc(10);
    *p = 17;
    int a = *p + 25;
    free(p);
    return a;
}

即使是一个比较复杂的一个成功的优化,return 42通过铛:

void bar(int* xs){
    for (int i = 0; i < 10; i++){
        xs[i] = i + 35;
    }
}

int foo(){
    int* xs = (int*)malloc(40);
    bar(xs);
    return xs[7];
}

但您不应期望太多:此类优化是不寻常的,并且通常是不可靠的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章