Devo insegnare ai miei studenti alloca? [chiuso]


18

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



8
Perché non insegnare loro VLA C99?

@cnicutar alloca () dipende dall'implementazione, ma almeno molte implementazioni restituiscono NULL in caso di errore. I VLA C99 non hanno modo di indicare un errore.
Complicato vedi bio

2
@sbi: Per SO questa è una domanda a risposta aperta che non si adatta al formato di ciò che i chiuditori pensano che i post SO dovrebbero essere. È troppo soggettivo, non esiste una risposta chiara, ma solo un'opinione. Il che va bene ma non per SO. Si noti inoltre che, per rispetto per il rappresentante del PO, nessuno vota male, stiamo chiudendo questa domanda come fuori tema.
Paul Sasik,

1
@PascalCuoq Non dovresti comunque allocare molto con alloca / VLA. Se non sei sicuro di cosa sia "molto" nel contesto attuale, usa malloc.

Risposte:


31

Se stai tenendo un corso di programmazione C generale, non dovresti insegnargli una cosa che non rientra nello standard. I programmatori principianti hanno inutilmente scritto codice non standard e / o non portatile perché insegnato in quel modo, negli ultimi 20-30 anni è stato un grosso problema per l'industria del software. 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 di tutto, dalle app hard realtime integrate al fluff delle applicazioni Windows per 15 anni senza mai usare quella funzione.


L'unico uso che ho visto dove non sarebbe stato meglio farlo in un altro modo è stato il rilevamento dello smash dello stack su alcune versioni di Windows, in cui un errore alloca indicava uno spazio insufficiente rimasto - o forse aveva solo un ASM nodoso per intercettare l'incidente ; è da un po 'che non guardo quel codice. Funzionava, ma era un po 'un orrore.
Donal Fellows,

13

Vedo accadere due cose:

  1. Gli studenti comprendono l'impatto alloca, leggono le differenze tra stack e heap e lo usano allocacon attenzione. (improbabile)

  2. Gli studenti pensano "wow, questo è come mallocsenza preoccuparsi di free", usarlo eccessivamente, ottenere lo overflow dello stack e non hanno idea di cosa accada.

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: http://www.strchr.com/alloca

mostra loro i pericoli e poi dì loro di non usarli. Impareranno ancora su stack contro heap, vedranno i pericoli in azione e potranno andare avanti con roba standard.


1
Penso che la maggior parte degli studenti rientri ancora nella seconda categoria anche dopo aver mostrato loro il codice di esempio.
bendaggio

@WTP - Probabilmente, ma è per questo che dici loro di non usarlo anche dopo aver mostrato loro cosa può succedere.
BlackJack,

4
Perché quel codice usa _allocapiuttosto che alloca? E perché lancia il risultato?
Keith Thompson,

5

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

Vuoi insegnare a qualcuno che già sa come programmare come scrivere C e lavorare con il codice C esistente in natura? In tal caso, 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) dovresti concentrarti sulle parti importanti (scrivere programmi modulari, subroutine, raccolte, .. .). Dal punto di vista di uno studente, alloca è un licenziamento ridondante dal momento che malloc è sufficiente nella maggior parte dei casi e da una prospettiva di buon codice è meglio menzionare esplicitamente come la gestione manuale della memoria è fastidiosa e come altre lingue affrontano questo problema Dopo tutto, ci sono più cose alla gestione della memoria quindi alloca o RAII, quindi non dovresti davvero limitarti a questi e come hai già detto, è molto più facile capire lo scopo di alloca se lo confronti con altri modi "più standard" di fare cose in altre lingue (o C99 ...)


2

No.

L'unico motivo per cui un programmatore C dovrebbe anche essere a conoscenza dell'esistenza di alloca è capire e correggere il codice legacy che lo utilizza.

Qualsiasi uso allocaè sia

  1. Inutile, cioè potrebbe essere banalmente sostituito da variabili a dimensione fissa di durata di memorizzazione automatica, OR
  2. Un pericoloso trabocco dello stack in attesa di accadere.

A parte alcuni esperimenti di pensiero per i quali non ho mai trovato alcun esempio nel mondo reale, non esiste un caso d'uso per alloca(o VLA) che non sia né inutile né vulnerabile (uno dei 2 casi precedenti).


2
Certo, nessuno potrebbe mai usarlo in modo responsabile. No, mai.
DeadMG

L'unico uso "responsabile" allocè equivalente al 100% agli array automatici di dimensioni fisse e meno portatile.
R .. GitHub smette di aiutare ICE il

Immagino, quindi, che nessuno potrebbe mai voler allocare una quantità dinamica, diciamo, alcuni kilobyte che non traboccherebbero mai. Oppure chiama alcune funzioni API del sistema operativo che diranno quanto è disponibile. O aumenta semplicemente le dimensioni dello stack.
DeadMG

Se sono pochi KB e sei sicuro di avere pochi KB, puoi semplicemente usare T foo[5000];o altro.
R .. GitHub FERMA AIUTANDO ICE il

Solo se T ha un costruttore predefinito banale. Se avessi bisogno di prestazioni, anche il semplice azzeramento della memoria potrebbe costarmi. Ma altri tipi possono avere una logica di costruzione di default ancora più complessa. Se volessi, per esempio, creare dinamicamente un array di std::mutex, potrei invocare una chiamata del kernel e un cambio di contesto per cinquemila mutex. Non economico. Per non parlare del costo aggiuntivo della cache per il posizionamento delle variabili locali dopo l'array.
DeadMG,

1

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


0

La documentazione GCC ha un paio di pro e contro pratici alloca(). Da un punto di vista pratico, una discreta quantità di software libero lo utilizza, quindi è bene capire come funziona e dove viene utilizzato nel codice esistente.

Passare le -Wl,-stack=dimensioni dello stack nuovo a gcc aumenta la dimensione dello stack massimo; dovrai farlo se il tuo progetto utilizza alloca()o alloca grandi array temporanei o usa la ricorsione oltre una certa profondità dipendente dal contesto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.