14

malloc/ free(またはnew/ delete) ペア infoを最適化できる成熟した C/C++ コンパイラはあり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);
}

の中へ

{
    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 (更新 1) コンパイラが 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 に答える