2010-06-21 6 views
16

¿Es una buena idea usar C99 VLA? ¿Cuándo es apropiado usar VLA comparado con malloc/free? (dado que VLA puede explotar la pila?)¿Es una buena idea usar C99 VLA en comparación con malloc/free?

+9

Evitar inexplicable TLA como VLA ... –

+17

@Thomas: El término "VLA" * tiene * un significado bien establecido y bien conocido en el contexto de C99. Alguien capaz de responder la pregunta sabrá lo que esto significa. –

+0

Posible duplicado de: http://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays –

Respuesta

22

Sí, excepto en los casos en que sabe que su pila puede explotar. También puede cambiar el tamaño de la pila si es necesario, es diferente cómo en cada sistema operativo pero es posible. Las ventajas de VLA son:

  • rápido: ajustar el puntero de pila y/o el puntero de marco se habría hecho de todos modos por lo que el costo de un VLA es casi 0.

  • Fácil: un simple definición, sin puntero para inicializar, para comprobar que no haya riesgo y sin riesgo de pérdida 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 presente errores sutiles.

tiene algunos inconvenientes:

  • Tamaño limitada: como ya se dijo, la pila puede explotar.

  • Los desbordamientos del búfer son un poco más graves que en la memoria del montón (se puede argumentar que es una ventaja, ya que una aplicación defectuosa es mejor que uno que corrompe silenciosamente los datos y finalmente falla en instrucciones no relacionadas).

  • Portabilidad: no todos los compiladores lo implementan, pero a menudo se puede simular por alloca (atención la semántica es un poco diferente pero nada realmente serio).

+1

Si simula el uso 'alloca()' (+1) no puede usar 'sizeof', que a menudo está oculto dentro de las macros. –

3

La principal ventaja con la asignación de la pila es que obtiene administración de memoria automática de la matriz de longitud variable asignada. Dado que la gestión de la memoria es uno de los principales desafíos para cualquier programa C, definitivamente debe usar VLA para simplificar su tarea, si puede.

Defenderé entonces que debe usar VLA de manera consistente siempre que pueda, y de lo contrario usaré malloc solo si: Necesita controlar la duración del almacenamiento, y si tiene asignaciones muy grandes, y si desea manejar errores de memoria con gracia.

+0

qué tan grande es 'muy grande' \ o/ –

1

C++ no soporta VLA. Por lo tanto, será un poco más esfuerzo portar el código a C++, en caso de necesidad.

Por otra parte, algunos creen que esto es realmente una buena cosa y astutamente proponer "clase" como un nombre maravilloso para un símbolo en c :-)

+2

'algunos creen que esto es realmente una buena cosa y astutamente proponen" clase "como un nombre maravilloso para un símbolo en c :-)': Bueno, cuando uno no puede ser mejor, la mejor manera de ganar es tratar de sabotear la competencia... – paercebal

Cuestiones relacionadas