编译器将 malloc/free 或 new/delete 对优化为 alloca

Will Compiler optimize malloc/free or new/delete pair into alloca

本文关键字:优化 alloca delete malloc free 编译器 new      更新时间:2023-10-16

有没有成熟的C/C++编译器,能够优化malloc/free(或new/delete)对信息alloca?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于某些有限的情况)。

只有当两个函数位于同一函数中(甚至在同一{}块中)时,才允许对 malloc/free 对进行这种优化,并且每次调用 malloc 时都会调用 free。另外,让我们考虑指向错误定位内存的指针未保存在某个全局变量中。

那么,GCC/LLVM+clang/Intel Compiler 会转换这样的代码块吗?

{
   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) 的情况

LLVM有一个分支叫做poolalloc,可以进行这种优化。它作为SAFECode的一部分进行维护,不在主线LLVM发行版中。

它在Chris Lattner的博士论文和这篇PLDI论文中都有描述。代码在这里。

从技术上讲,编译器可以优化任何内容,只要它们遵循 As-If 规则
因此,优化堆分配到堆栈分配是可能的,但编译器需要足够智能来探测用法并确定将分配更改为堆栈不会影响程序的可观察行为。

我不知道有任何编译器可以做到这一点。