¿Es una buena idea usar C99 VLA en comparación con malloc/free?

4 minutos de lectura

avatar de usuario
Nyan

¿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?)

  • 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

avatar de usuario
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 usar sizeofque 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

avatar de usuario
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad