¿Cuán ampliamente utilizado es alloca
en el mundo real? ¿Debo enseñar a mis alumnos a usar alloca
cuando tenga sentido? ¿O debería enseñarles a nunca usarlo? Viniendo de un fondo C ++ RAII, la idea de no tener que llamar free
manualmente suena prometedor, especialmente en funciones con múltiples puntos de salida.
18
malloc
.Respuestas:
Si está realizando un curso de programación general en C, no debe enseñarles algo que no está en el estándar. Los programadores principiantes escriben innecesariamente código no estándar y / o no portátil porque se les enseñó de esa manera, ha sido un gran problema para la industria del software durante los últimos 20-30 años más o menos. El costo por no enseñarles el estándar y nada más que el estándar es probablemente astronómico.
Si está realizando un curso más avanzado en algoritmos o programación de aplicaciones, puede ser bueno mencionarlo. Por otro lado, he programado todo, desde aplicaciones integradas en tiempo real duras hasta aplicaciones de Windows durante 15 años sin usar esa función.
fuente
Puedo ver que suceden dos cosas:
Los estudiantes comprenden el impacto de
alloca
, leen sobre las diferencias entre la pila y el montón, y lo usan conalloca
cuidado. (improbable)Los estudiantes piensan "wow, esto es como
malloc
sin preocuparse por elfree
", úselo en exceso, obtenga un desbordamiento de pila y no tenga idea de qué pasa.Creo que es mucho mejor si lo describe
alloca
, luego ejecute este código:Fuente: http://www.strchr.com/alloca
muéstrales los peligros y luego diles que no lo usen. Todavía aprenderán sobre stack vs. heap, verán los peligros en acción y podrán seguir adelante con cosas estándar.
fuente
_alloca
lugar dealloca
? ¿Y por qué arroja el resultado?La respuesta a esta pregunta debe basarse en cuáles son sus objetivos en primer lugar.
¿Quieres enseñar a alguien que ya sabe cómo programar cómo escribir C y trabajar con el código C existente en la naturaleza? Si es así, cuéntele sobre alloca y cualquier otra cosa que desee.
Por otro lado, si está enseñando un curso introductorio que solo usa C por coincidencia (y porque C es un lenguaje muy pequeño, etc.), debe centrarse en las partes importantes (escribir programas modulares, subrutinas, colecciones, etc.). .). Desde la perspectiva de un estudiante, alloca es un bir redundante ya que malloc es suficiente en la mayoría de los casos y desde una perspectiva de buen código, es mejor mencionar explícitamente cómo la gestión manual de la memoria es molesta y cómo otros idiomas abordan este problema Después de todo, hay más cosas para la gestión de la memoria, luego alloca o RAII, por lo que realmente no debería restringirse a estas y, como ya mencionó, es mucho más fácil comprender el propósito de alloca si lo compara con otras formas "más estándar" de hacer cosas en otros idiomas (o C99 ...)
fuente
No.
La única razón por la que un programador de C debería ser consciente de la existencia de alloca es para comprender y corregir el código heredado que lo está usando.
Cualquier uso de
alloca
esAdemás de algunos experimentos mentales para los que nunca he encontrado ejemplos del mundo real, no hay ningún caso de uso para
alloca
(o VLA) que no sea inútil o vulnerable (uno de los 2 casos anteriores).fuente
alloc
es 100% equivalente a los arreglos automáticos de tamaño fijo, y menos portátil.T foo[5000];
o lo que sea.std::mutex
, podría invocar una llamada del núcleo y un cambio de contexto para cinco mil mutexes. No es barato. Sin mencionar el costo adicional de caché de colocar variables locales después de la matriz.Mi opinión es que no aliente su uso a menos que esté enseñando principios de compilación de bajo nivel utilizados para asignar espacio de pila para variables locales. Enseñarlo en ese contexto.
fuente
La documentación de GCC tiene un par de ventajas y desventajas prácticas
alloca()
. Desde una perspectiva práctica, una cantidad decente de software libre lo usa, por lo que es bueno saber cómo funciona y dónde se usa en el código existente.Pasar
-Wl,-stack=
new-stack-size a gcc aumenta el tamaño máximo de pila; deberá hacer esto si su proyecto usaalloca()
o asigna grandes matrices temporales o usa la recursividad más allá de una determinada profundidad dependiente del contexto.fuente