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) からのものであることを知っている場合にのみ、議論を制限できます。