Compiler会将malloc/free或new/delete对优化为alloca

osg*_*sgx 12 c++ compiler-construction optimization gcc llvm

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

当两个函数在同一个函数中(或者甚至在同一个块中{})时,只允许malloc/free对允许这种优化,并且每次调用malloc时都调用free.另外,让我们考虑指向malloced内存的指针不会保存在某个全局变量中.

那么,GCC/LLVM + clang/Intel编译器会转换这样的代码块:

{
   char *carray;
   carray = malloc(100);          // or malloc(N)
   // some string-like work with carray
   free(carray);
}
Run Code Online (Sandbox Code Playgroud)

{
    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)
}
Run Code Online (Sandbox Code Playgroud)

这种转换对每个程序都不是很有用,但我认为,可能有一些特殊的编译器选项.

PS(update1)我们可以将讨论仅限于编译器知道malloc和free来自libc(stdlib)的情况

ohm*_*ics 7

有一个名为poolalloc的LLVM的off-shoot可以进行这种优化.它作为SAFECode的一部分进行维护,不在主线LLVM分发中.

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


Alo*_*ave 2

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

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