Dovrei insegnare ai miei studenti alloca? [chiuso]

16

Quanto è ampiamente usato alloca nel mondo reale? Devo insegnare ai miei studenti a usare alloca quando ha senso? O dovrei insegnare loro a non usarlo mai? Provenendo da uno sfondo C ++ RAII, l'idea di non dover chiamare free sembra promettente, specialmente nelle funzioni con più punti di uscita.

    
posta fredoverflow 25.10.2011 - 15:49
fonte

6 risposte

30

Se stai tenendo un corso di programmazione generale in C, non dovresti insegnargli una cosa che non è nello standard. I programmatori principianti che scrivono inutilmente codice non standard e / o non portatile perché sono stati insegnati in quel modo, è stato un grosso problema per l'industria del software negli ultimi 20-30 anni circa. Il costo per non insegnare loro lo standard e nient'altro che lo standard è probabilmente astronomico.

Se stai tenendo un corso più avanzato in algoritmi o programmazione di applicazioni, potrebbe essere utile menzionarlo. D'altra parte, ho programmato tutto, dalle applicazioni embedded in tempo reale alle applicazioni per Windows per 15 anni senza mai usare quella funzione.

    
risposta data 25.10.2011 - 16:02
fonte
12

Riesco a vedere due cose che accadono:

  1. Gli studenti comprendono l'impatto di alloca , leggono le differenze tra stack e heap e usano attentamente alloca . (Improbabile)

  2. Gli studenti pensano "wow, questo è come malloc senza preoccuparsi di free ," usarlo eccessivamente, ottenere uno stack overflow e non avere idea di cosa succede.

Penso che sia molto meglio se descrivi alloca , quindi esegui questo codice:

#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);
} 

Fonte: link

mostra loro i pericoli e poi di 'loro di non usarlo. Impareranno ancora a conoscere lo stack rispetto all'heap, a vedere i pericoli in azione e a passare a cose standard.

    
risposta data 25.10.2011 - 16:24
fonte
5

La risposta a questa domanda dovrebbe essere basata su quali sono i tuoi obiettivi in primo luogo.

Vuoi insegnare a qualcuno che sa già come programmare come scrivere in C e lavorare con il codice C esistente in natura? Se è così, parla di alloca e di qualsiasi altra cosa tu voglia.

D'altra parte, se stai insegnando un corso introduttivo che usa solo C per coincidenza (e perché C è un linguaggio molto piccolo e così via) devi concentrarti sulle parti importanti (scrivendo programmi modulari, subroutine, raccolte , ...). Dal punto di vista dello studente, alloca è un bir redundant dal momento che malloc è sufficiente nella maggior parte dei casi e dal punto di vista del codice buono è meglio citare esplicitamente come la gestione manuale della memoria è fastidiosa e come le altre lingue trattano con questo problema Dopotutto, ci sono più cose per la gestione della memoria quindi alloca o RAII quindi non dovresti davvero limitarti a queste e come hai già detto, è molto più facile capire lo scopo di alloca se lo paragoni ad altri "più standard" modi per fare cose in altre lingue (o C99 ...)

    
risposta data 25.10.2011 - 16:16
fonte
2

No.

L'unica ragione per cui un programmatore C dovrebbe essere a conoscenza dell'esistenza di alloca è capire e correggere il codice legacy che lo sta usando.

Qualsiasi utilizzo di alloca è o

  1. Inutile, cioè potrebbe essere banalmente sostituito da variabili a dimensione fissa della durata della memorizzazione automatica, OPPURE
  2. Un pericoloso overflow in attesa di verificarsi.

A parte alcuni esperimenti di pensiero per i quali non ho mai trovato esempi reali, non vi è alcun caso d'uso per alloca (o VLA) che non sia né inutile né vulnerabile (uno dei due casi precedenti).

    
risposta data 25.10.2011 - 17:35
fonte
1

La mia opinione è di non incoraggiarne l'utilizzo a meno che tu non stia insegnando i principi del compilatore di basso livello usati per allocare lo spazio di stack per le variabili locali. Insegnalo in quel contesto.

    
risposta data 25.10.2011 - 19:45
fonte
0

La documentazione GCC ha un paio di vantaggi e svantaggi pratici per %codice%. Dal punto di vista pratico, una buona quantità di software libero lo usa, quindi è bene capire come funziona e dove è usato nel codice esistente.

Il passaggio di alloca() new-stack-size a gcc aumenta la dimensione massima dello stack; dovrai farlo se il tuo progetto utilizza -Wl,-stack= , o alloca grandi array temporanei o utilizza la ricorsione oltre una certa profondità dipendente dal contesto.

    
risposta data 29.10.2013 - 02:55
fonte

Leggi altre domande sui tag