Czy istnieje C/C++ kompilator dojrzałe, zdolne do optymalizacji malloc
/free
(lub new
/delete
) par informacji alloca
? Innymi słowy, konwertuj z pamięci opartej na sterty do opartej na stosach (TYLKO dla niektórych ograniczonych przypadków).Will Compiler optymalizacji malloc/free lub nowe/usuwać parę do alloca
Ta optymalizacja może być dozwolona tylko dla pary malloc/free, gdy obie funkcje są w tej samej funkcji (lub nawet w tym samym bloku {}
), a wolna jest wywoływana za każdym razem, gdy wywoływana jest funkcja malloc. Rozważmy także, że wskaźnik do pamięci mallokowanej nie jest zapisywany w niektórych zmiennych globalnych.
Tak, będzie GCC/LLVM + szczęk/Intel Compiler przekonwertować taki fragment kodu:
{
char *carray;
carray = malloc(100); // or malloc(N)
// some string-like work with carray
free(carray);
}
do
{
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)
}
Konwersja ta może nie być bardzo przydatna dla każdego programu, ale myślę, może istnieć specjalna opcja kompilatora.
PS (update1) Możemy ograniczyć nasze rozważania tylko do przypadków, gdy kompilator wie, że malloc i wolna jest od libc (stdlib)
Rok temu jeden człowiek na liście llvm [powiedział nie] (http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-July/032971.html) i inny człowiek [powiedział tak] (http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-July/033015.html) i wskazuje na [faktyczny kod] (http: //lists.cs.uiuc.edu/pipermail/llvmdev/2010-July/033017.html) – osgx
Myślę, że malloc nie jest nieodłączny. Jest to dość niebezpieczne, ponieważ kompilator nie ma informacji o rozmiarze stosu w czasie wykonywania. – BlueWanderer
Transformacja jest niebezpieczna, jeśli zostanie wywołana jakakolwiek inna funkcja, której kompilator nie może odczytać definicji, i jest przekazywana wynikowi funkcji malloc: funkcja może przechowywać gdzieś wskaźnik, a następnie pomijać wolny przez 'longjmp' (C, zwykle) lub wyjątek (C++). Podejrzewam, mając to na uwadze, że transformacja jest mniej przydatna, niż sobie wyobrażasz. – hvd