¿Debo enseñar a mis alumnos la asignación? [cerrado]

16

¿Qué tan 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? Desde un fondo C ++ RAII, la idea de no tener que llamar a free manualmente suena prometedor, especialmente en funciones con múltiples puntos de salida.

    
pregunta fredoverflow 25.10.2011 - 15:49

6 respuestas

30

Si está realizando un curso en programación general en C, no debe enseñarles una cosa que no esté en el estándar. Los programadores principiantes que escriben innecesariamente código no estándar y / o no portátil porque se les enseñó de esa manera, han sido un gran problema para la industria del software durante los últimos 20 a 30 años. 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 duras en tiempo real hasta aplicaciones de aplicaciones de Windows durante 15 años sin usar esa función.

    
respondido por el user29079 25.10.2011 - 16:02
12

Puedo ver dos cosas sucediendo:

  1. Los estudiantes entienden el impacto de alloca , leen sobre las diferencias entre la pila y el montón, y usan alloca con cuidado. (improbable)

  2. Los estudiantes piensan "wow, esto es como malloc sin preocuparse por el free ", úsalo en exceso, obtén un desbordamiento de pila y no tienes idea de lo que está pasando.

Creo que es mucho mejor si describe alloca y luego ejecuta este código:

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

Fuente: enlace

muéstreles los peligros y luego dígales que no lo usen. Todavía aprenderán acerca de la pila contra el montón, verán los peligros en acción y podrán seguir adelante con las cosas estándar.

    
respondido por el BlackJack 25.10.2011 - 16:24
5

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éntanos sobre la aloca y cualquier otra cosa que quieras.

Por otra parte, 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). , ...). Desde la perspectiva de un estudiante, alloca es un poco redundante, ya que malloc es suficiente en la mayoría de los casos y desde la perspectiva de un buen código, es mejor mencionar explícitamente cómo la administración de memoria manual es molesta y cómo otros idiomas tratan con esto problema Después de todo, hay más cosas en la gestión de la memoria que la alloca o la RAII, por lo que realmente no debería limitarse a ellas y, como ya mencionó, es mucho más fácil entender el propósito de la aloca si la compara con otras "más estándar". formas de hacer las cosas en otros idiomas (o C99 ...)

    
respondido por el hugomg 25.10.2011 - 16:16
2

No.

La única razón por la que un programador de C debería ser consciente de la existencia de alloca es entender y corregir el código heredado que lo está utilizando.

Cualquier uso de alloca es cualquiera

  1. Inútil, es decir, podría ser reemplazado trivialmente por variables de tamaño fijo de duración de almacenamiento automático, O
  2. Un peligroso desbordamiento de pila a la espera de que suceda.

Aparte de algunos experimentos mentales para los que nunca he encontrado ningún ejemplo del mundo real, no hay un caso de uso para alloca (o VLA) que no sea inútil o vulnerable (uno de los 2 casos anteriores).

    
respondido por el R.. 25.10.2011 - 17:35
1

Mi opinión es que no recomiendo su uso a menos que esté enseñando principios de compilación de bajo nivel utilizados para asignar espacio de pila para variables locales. Enséñalo en ese contexto.

    
respondido por el MartyTPS 25.10.2011 - 19:45
0

La documentación de GCC tiene un par de ventajas y desventajas prácticas en %código%. Desde una perspectiva práctica, una cantidad decente de software libre lo usa, por lo que es bueno entender cómo funciona y dónde se usa en el código existente.

Pasar alloca() new-stack-size a gcc aumenta el tamaño máximo de pila; deberá hacer esto si su proyecto usa -Wl,-stack= , o asigna grandes arreglos temporales o usa la recursión más allá de cierta profundidad dependiente del contexto.

    
respondido por el user117529 29.10.2013 - 02:55

Lea otras preguntas en las etiquetas