¿Debo enseñar a mis alumnos alloca? [cerrado]

18

¿Cuán ampliamente utilizado es allocaen el mundo real? ¿Debo enseñar a mis alumnos a usar allocacuando tenga sentido? ¿O debería enseñarles a nunca usarlo? Viniendo de un fondo C ++ RAII, la idea de no tener que llamar freemanualmente suena prometedor, especialmente en funciones con múltiples puntos de salida.

flujo libre
fuente
8
¿Por qué no enseñarles VLA C99?
@cnicutar alloca () depende de la implementación, pero al menos muchas implementaciones devuelven NULL en caso de falla. Los VLA C99 no tienen forma de indicar una falla.
Complicado ver biografía
2
@sbi: Para SO, esta es una pregunta abierta que realmente no se ajusta al formato de lo que los taponadores creen que deberían ser las publicaciones de SO. Es demasiado subjetivo, no hay una respuesta clara, simplemente una opinión. Lo cual está bien pero no para SO. Observe también que, por respeto al representante del OP, nadie rechaza la votación, solo estamos cerrando esta pregunta como fuera de tema.
Paul Sasik
1
@PascalCuoq De todos modos, no debería asignar mucho con alloca / VLAs. Si no está seguro de qué es "mucho" en el contexto actual, use malloc.

Respuestas:

31

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
El único uso que he visto donde no sería mejor hacerlo de otra manera fue hacer la detección de aplastamiento de la pila en algunas versiones de Windows, donde una falla en la asignación indicaba que quedaba espacio insuficiente, o tal vez solo tenía un ASM retorcido para atrapar el accidente ; Ha pasado un tiempo desde que vi ese código. Funcionó, pero fue un poco horroroso.
Donal Fellows
13

Puedo ver que suceden dos cosas:

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

  2. Los estudiantes piensan "wow, esto es como mallocsin preocuparse por el free", ú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:

#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: 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.

Veintiuna
fuente
1
Creo que la mayoría de los estudiantes todavía entran en la segunda categoría, incluso después de mostrarles el código de ejemplo.
derecha el
@WTP: probablemente, pero es por eso que les dice que no lo usen incluso después de mostrarles lo que puede suceder.
BlackJack
44
¿Por qué usa ese código en _allocalugar de alloca? ¿Y por qué arroja el resultado?
Keith Thompson el
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é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 ...)

hugomg
fuente
2

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 allocaes

  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 desbordamiento de pila peligroso esperando a suceder.

Ademá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).

R .. GitHub DEJA DE AYUDAR AL HIELO
fuente
2
Por supuesto, absolutamente nadie podría usarlo de manera responsable. No nunca.
DeadMG
El único uso "responsable" de alloces 100% equivalente a los arreglos automáticos de tamaño fijo, y menos portátil.
R .. GitHub DEJA DE AYUDAR AL HIELO
Supongo, entonces, que nadie podría querer asignar una cantidad dinámica, digamos, unos pocos kilobytes que nunca se desbordarían. O llame a alguna función API del sistema operativo que les dirá cuánto está disponible. O simplemente aumente el tamaño de la pila a mucho.
DeadMG
Si se trata de unos pocos KB y está seguro de tener unos pocos KB, simplemente puede usar T foo[5000];o lo que sea.
R .. GitHub DEJA DE AYUDAR AL HIELO
Solo si T tiene un constructor trivial predeterminado. Si necesitaba rendimiento, incluso la simple reducción a cero de la memoria podría costarme. Pero otros tipos pueden tener una lógica de construcción predeterminada aún más compleja. Si quisiera, por ejemplo, crear dinámicamente una matriz de 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.
DeadMG
1

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.

MartyTPS
fuente
0

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 usa alloca()o asigna grandes matrices temporales o usa la recursividad más allá de una determinada profundidad dependiente del contexto.

usuario117529
fuente