¿Hay alguna madurar C/C++, capaz de optimizar malloc
/free
(o new
/delete
) pares alloca
información? En otras palabras, convierta de memoria basada en pila a basada en pila (SOLAMENTE para algunos casos limitados).Will compilador optimizar malloc/libre o nuevos/borrar par en alloca
Esta optimización solo puede permitirse para un par de malloc/free cuando ambas funciones están en la misma función (o incluso en el mismo bloque de {}
), y se invoca a free cada vez que se invoca malloc. Además, consideremos que el puntero a la memoria mal colocada no se guarda en alguna variable global.
Así, se GCC/LLVM + sonido metálico/Intel Compiler convertir tales bloque de código:
{
char *carray;
carray = malloc(100); // or malloc(N)
// some string-like work with carray
free(carray);
}
en
{
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)
}
Esta conversión puede no ser muy útil para todos los programas, pero creo , puede haber alguna opción de compilador especial.
PS (Update1) Podemos limitar nuestra discusión sólo para los casos en que el compilador sabe que malloc y libre es de libc (stdlib)
Hace un año un hombre en la lista llvm [dijo no] (http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-July/032971.html) y otro hombre [dijo sí] (http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-July/033015.html) y apunta a [código real] (http: //lists.cs.uiuc.edu/pipermail/llvmdev/2010-July/033017.html) – osgx
Creo que malloc no es intrínseco. Y es bastante peligroso hacerlo, ya que el compilador no tiene información sobre el tamaño de la pila en tiempo de ejecución. – BlueWanderer
La transformación no es segura si se llama a cualquier otra función cuyo compilador no puede ver la definición y se pasa el resultado de malloc: la función puede almacenar el puntero en algún lugar y luego omitir el libre por 'longjmp' (C, generalmente) o excepción (C++). Sospecho, teniendo esto en cuenta, que la transformación es menos útil de lo que imaginas. – hvd