14

是否有任何成熟的 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) 的情况

4

2 回答 2

7

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

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

于 2012-05-11T22:06:08.950 回答
2

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

我不知道有任何编译器这样做。

于 2012-04-28T15:59:11.590 回答