¿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?
Respuesta
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).
Si simula el uso 'alloca()' (+1) no puede usar 'sizeof', que a menudo está oculto dentro de las macros. –
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.
qué tan grande es 'muy grande' \ o/ –
Para una buena lista de enlaces relacionados con el C99 (incluyendo enlaces a información acerca de las matrices de longitud variable) ver:
Xcode se encuentra por defecto de usar C99 - C99 ¿cuál es?
http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html
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 :-)
'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
- 1. ¿Es una buena idea usar una función CreateUUID() como sal?
- 2. ¿Es buena idea usar nombres de URL con caracteres especiales?
- 3. sqlite e hibernate - es una buena idea?
- 4. ¿Es correcto (VERDADERO) una buena idea en C?
- 5. internacionalización con nibs. ¿Es realmente una buena idea?
- 6. ¿Campos multivalorados una buena idea?
- 7. ¿Es una buena idea usar un conmutador con Fallthrough para manejar los argumentos predeterminados en Javascript?
- 8. ¿Es una buena idea poner db/schema.rb en .gitignore list ??
- 9. Implementar una clase "LazyProperty": ¿es esta una buena idea?
- 10. ¿Es una buena idea usar varargs en una API C para establecer pares de valores clave?
- 11. Es una buena idea guardar gráficos en MySQL?
- 12. ¿Es una buena idea ejecutar `... par.map (` en listas grandes directamente?
- 13. ¿Es una buena idea una clase de "preferencias maestras"?
- 14. ¿Es una buena idea aprender primero LINQ, luego SQL?
- 15. ¿Es una buena idea hornear procesos en PHP/Apache?
- 16. ¿Es una buena idea usar una columna calculada como parte de una clave principal?
- 17. ¿Es una buena idea devolver "const char *" de una función?
- 18. ¿Es una buena idea usar un parámetro enum en la función API pública en C?
- 19. ¿Es una buena idea usar Kerberos para autenticarse en sitios web y servicios web?
- 20. ¿Cuándo no es una buena idea pasar por referencia?
- 21. ¿Es una buena idea usar la clase como un espacio de nombres en Python
- 22. activerecord como modelo, ¿es esta una buena idea?
- 23. ¿Cuándo se usa __call__ una buena idea?
- 24. ¿C99 es compatible con C89?
- 25. ¿Es una buena idea preferir NSNumberFormatterBehavior10_4 sobre NSNumberFormatterBehaviorDefault?
- 26. ¿Puede un minificador hacer esto? (.... y ¿es una buena idea?)
- 27. ¿Es una buena idea comparar double.MaxValue para la igualdad?
- 28. ¿Es una buena idea peinar la etiqueta del cuerpo?
- 29. ¿Cuándo es una buena idea la herencia virtual?
- 30. cambiar a mysqli una buena idea?
Evitar inexplicable TLA como VLA ... –
@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. –
Posible duplicado de: http://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays –