是否有任何成熟的 C/C++ 编译器,能够优化malloc
/ free
(或new
/ delete
)对信息alloca
?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于一些有限的情况)。
只有当两个函数在同一个函数中(甚至在同一个块中{}
)时,才允许对 malloc/free 进行这种优化,并且每次调用 malloc 时都会调用 free。另外,让我们考虑指向分配内存的指针没有保存在某个全局变量中。
那么,GCC/LLVM+clang/Intel 编译器是否会转换这样的代码块:
{
char *carray;
carray = malloc(100); // or malloc(N)
// some string-like work with carray
free(carray);
}
进入
{
char*carray;
carray = alloca(100); // or if(N<const1) carray=alloca(N);else carray=malloc(N)
// the same work
// nothing // or if(N>=const1) free(carray)
}
这种转换可能对每个程序都不是很有用,但我认为,可能会有一些特殊的编译器选项。
PS (update1) 我们可以将讨论仅限于编译器知道 malloc 和 free 来自 libc (stdlib) 的情况