我知道有时候编译器会删除未使用的数组。
但是我的问题是对使用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] 删除。
我来说两句