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

标签 c memory-management

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

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

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

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

最佳答案

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

例如,gccclang optimize these functions只需使用 -O2返回 42:

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;
}

更复杂的是 successfully optimized通过 clang 返回 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];
}

但是您不应该期望太多:此类优化很不寻常,而且一般来说是不可靠的。

关于c - 编译器优化会影响动态内存分配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056344/

相关文章:

c# - C的反射类特征

c - 进程阻塞了哪些调用?

c++ - 如何从int **中快速获取一维int数组?

c - 内存分配失败。但是为什么会崩溃呢?或者是吗?

c - 将无符号字符转换为有符号数据类型时,为什么在汇编中使用 movzbl?

c - AVR ATMega328P ADC channel 选择问题

Java应用肆意消耗内存

java - Android - 有效的性能和内存管理

c++ - 迁移到 64 位时,内存使用量可能会增长多少?

c - 相当于 LD_PRELOAD 的 gcc 标志?