Puede evitar que se bloquee al no usarlos. :)
Con toda seriedad, casi no hay una forma segura de utilizar matrices de longitud variable para hacerte la vida más fácil a menos que tengas límites fuertes en el tamaño. Por otro lado, puede utilizarlos de forma condicional, en formas como esto:
char vla_buf[n < 1000 ? n : 1];
char *buf = sizeof vla_buf < n ? malloc(n) : vla_buf;
if (!buf) goto error;
/* ... Do stuff with buf ... */
if (buf != vla_buf) free(buf);
Mientras que esto parece el dolor inútil, se puede hacer una gran diferencia de rendimiento, especialmente en aplicaciones con subprocesos, donde muchas llamadas a malloc
y free
podía resultado en contención de bloqueo. (Un beneficio notable de este truco es que se puede apoyar a los compiladores de edad sin VLA mediante la simple sustitución [n < 1000 ? n : 1]
con 1000
, por ejemplo, con una macro.)
Otro caso oscura donde VLA puede ser útil es en algoritmos recursivos donde se sabe que la el número total de entradas de matriz requeridas en todos los niveles de recursividad está limitado por n
, donde n
es lo suficientemente pequeño como para estar seguro de que no se desbordará la pila, pero donde podría haber hasta n
niveles de recursión y niveles individuales que agotan a n
elementos. Antes de C99, la única forma de manejar este caso sin tomar el espacio de pila n^2
era usar malloc
. Con los VLA, puedes resolver el problema completamente en la pila.
Tenga en cuenta que estos casos en los que los VLA son realmente beneficiosos son muy raros. Normalmente, VLA es solo una manera de engañarse a sí mismo de que la administración de la memoria es fácil, hasta que se ve afectado por las vulnerabilidades resultantes (triviales para explotar) que ha creado.:-)
Editar: A la pregunta original, mejor dirección de OP:
#define MAX_VLA 10000
int bar(size_t n)
{
int arr[n <= MAX_VLA ? n : 1];
if (sizeof arr/sizeof *arr < n) return ENOMEM;
/* ... */
return 0;
}
Su límite puede (dependiendo del sistema, por supuesto) no ser "memoria" sino "tamaño de la pila". Y ahora la pregunta tiene más sentido para mí porque estaba pensando en tu implementación "anterior" en una caja de consumo razonablemente moderna y preguntándome * "¿Qué está haciendo que necesita una gran parte de un GB?" *. De todas formas. Si la pila te limita, la "vieja" forma puede ser mejor. – dmckee
Esta es exactamente la razón por la que los VLA no se utilizan tanto (otro soporte deficiente en compiladores). C99 VLAs simplemente no son estables. – VSG24