我知道有时编译器会删除未使用的数组。
但我的问题是对使用 malloc 分配的动态变量或仅对堆栈变量有影响吗?
malloc 是编译时操作还是运行时操作?
如果是运行时,编译器可以删除使用 malloc 分配的数组还是只能删除固定大小的数组?
最佳答案
编译器可以删除 malloc
及其系列,因为内存分配不是可观察到的行为。
例如,gcc
和 clang
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/