¿Es una buena idea usar C99 VLA? ¿Cuándo es apropiado usar VLA en comparación con malloc/free? (ya que VLA puede explotar la pila?)
¿Es una buena idea usar C99 VLA en comparación con malloc/free?
Nyan
patricio schlüter
Sí, excepto en los casos en los que sabes que tu stack puede explotar. También puede cambiar el tamaño de la pila si es necesario, es diferente en cada sistema operativo, pero es posible. Las ventajas de VLA son:
-
Rápido: el ajuste del puntero de pila y/o el puntero de marco se habría realizado de todos modos, por lo que el costo de un VLA es casi 0.
-
Fácil: una definición simple, sin puntero para inicializar, para verificar y sin riesgo de fugas de memoria.
-
Es automáticamente seguro para subprocesos ya que cada subproceso tiene su propia pila. También tiene una mejor escala ya que no hay necesidad de bloqueo, un problema que puede surgir al usar
malloc/free
. -
Legible: es realmente un concepto simple, por lo que es menos probable que introduzca errores sutiles.
Tiene algunos inconvenientes:
-
Tamaño limitado: como ya se dijo, la pila puede explotar.
-
Los desbordamientos de búfer son un poco más serios que en la memoria de almacenamiento dinámico (se puede argumentar que es una ventaja, ya que una aplicación que falla es mejor que una que corrompe los datos en silencio y eventualmente falla en instrucciones no relacionadas).
-
Portabilidad: no todos los compiladores lo implementan, pero a menudo puede ser simulado por
alloca
(atención, la semántica es un poco diferente pero nada realmente serio).
-
Si simula usar
alloca()
(+1) no puedes usarsizeof
que a menudo está oculto dentro de las macros.–Joseph Quinsey
14 de octubre de 2012 a las 4:59
La principal ventaja con la asignación de pilas es que obtienes gestión automática de memoria de la matriz de longitud variable asignada. Dado que la administración de la memoria es uno de los principales desafíos para cualquier programa C, definitivamente debería usar VLA para simplificar su tarea, si puede.
Luego recomendaré que use los VLA de manera consistente cuando pueda y, de lo contrario, use malloc solo si: Necesita controlar la duración del almacenamiento, y si tiene asignaciones muy grandes, y si desea manejar la falta de memoria. errores con gracia.
-
qué tan grande es ‘muy grande’ \o/
– Jamie Paté
5 de diciembre de 2017 a las 23:47
Solo agregando otro aspecto (no es una respuesta directa, ya que no está involucrado malloc/free, pero aún está relacionado):
//
// File: someheader.h
//
// Description: Some header intended to be usable in C a n d C++.
// (skipping include guards only for brevity!)
//
#ifdef __cplusplus
extern "C"
{
#endif
void f(size_t n, int(*)[n]); // OOPS: not supported by C++...
#ifdef __cplusplus
}
#endif
Así que no es solo por la portabilidad, sino por un problema de compatibilidad más general…
Si necesita dicha compatibilidad, debe omitir VLA.
C++ no admite VLA. Por lo tanto, será un poco más de esfuerzo migrar el código a C++, en caso de que surja la necesidad.
Por otra parte, algunos creen que esto es realmente algo bueno y astutamente proponen “clase” como un nombre maravilloso para un símbolo en c 🙂
Para obtener una buena lista de enlaces relacionados con C99 (incluidos enlaces a información sobre matrices de longitud variable), consulte:
Xcode ahora utiliza de forma predeterminada C99, entonces, ¿qué es C99?
http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html
Morten Ofstad
Es una buena idea usar VLA C99 si tiene un proyecto que solo va a compilar con un compilador compatible con C99 y la alternativa es usar alloca(). Los VLA no deben usarse donde normalmente usaría malloc() y si no sabe qué hace alloca() y qué problemas podría encontrar, no debería usar VLA.
Evite TLA inexplicables como VLA…
– Thomas Padrón-McCarthy
21 de junio de 2010 a las 5:50
@Thomas: El término “VLA” posee un significado bien establecido y conocido en el contexto de C99. Alguien capaz de responder a la pregunta sabrá lo que esto significa.
– Konrad Rodolfo
21 de junio de 2010 a las 9:16
Posible duplicado de: stackoverflow.com/questions/2034712/…
– Ciro Santilli Путлер Капут 六四事
23 de abril de 2016 a las 7:50