2010-03-14 19 views
8

È uno stile sbagliato progettare i tuoi programmi C semplici per allocare tutto, o quasi tutto, nello stack?Assegnazione stack in C

+3

Dipende da cosa significa "tutto". – AraK

+1

Se hai intenzione di fare tutto con la gente del posto e i parametri, perché stai usando C in primo luogo? Usa invece un linguaggio funzionale come ML, Haskell, Erlang, ecc. –

+0

Al contrario di cosa, stai pensando? Variabili globali o dati sull'heap? –

risposta

16

È uno stile dannoso utilizzare l'allocazione dell'heap se non è realmente necessario. Soprattutto nei programmi semplici.

+2

Vorrei più di +1 se potessi. L'allocazione dello stack è sicura, previene le perdite di memoria ed evita problemi con il puntatore nullo o inutile. Usalo quando è possibile. – kyoryu

+1

+1 - Assolutamente - l'heap è una struttura dati più complessa dello stack e non solo un sovraccarico non necessario in molti casi, ma anche una causa di complessità non necessaria con potenziali problemi come puntatori penzolanti, perdite di memoria, problemi di heap, ecc. Nessun motivo per evitare l'heap quando necessario, ma certamente è un'opzione "quando necessario", non l'opzione predefinita sensata. – Steve314

+0

E non c'è heap in C. –

1

Se mettiamo l'accento sui programmi SEMPLICI, come hai detto, allora no, non è così male :) Puoi anche dare un'occhiata agli array di lunghezza variabile C99 (ecco un semplice esempio: http://en.wikipedia.org/wiki/Variable-length_array).

+0

+1 Per menzionare gli VLA. Li ho usati in un piccolo progetto e hanno aiutato a evitare l'allocazione dell'heap per la maggior parte del tempo. – helpermethod

0

No. A meno che non si disponga di variabili con dimensioni non fisse. Tale codice potrebbe lasciare un overflow dello stack abbastanza velocemente.

3

Le allocazioni dello stack sono meno costose delle allocazioni di heap. L'allocazione e la deallocazione dallo stack sono solo semplici incrementi del contatore e decrementi sulla funzione (o per essere più esatti: scope) entry/exit. Assegnazioni di heap significa trovare un blocco di memoria abbastanza grande in uno spazio di indirizzi possibilmente frammentato. A causa di questo, le allocazioni di stack sono quasi sempre preferibili.

I principali motivi per non usare lo stack sono:

  • La dimensione richiesta non è noto fino al runtime.
  • È necessaria molta memoria (Megabyte); che può causare problemi su sistemi in cui le dimensioni dello stack sono in genere limitate a numeri a due cifre di Megabyte.
+2

Oppure se è necessaria molta memoria (Kilobyte); che può causare problemi su sistemi in cui le dimensioni dello stack sono in genere limitate a numeri a due cifre di Kilobyte (come driver di periferica su PC o qualsiasi programma nella maggior parte dei sistemi embedded). – Dipstick

1

Il vantaggio principale dell'heap è che è possibile allocarlo dinamicamente. Se non conosci la dimensione della variabile che ti serve: accumulala.

Se il programma è semplice, potrebbe non essere necessario allocare una variabile nell'heap; ma la scelta non dipende dalla complessità del programma, dipende dalla necessità che hai della variabile. Se è necessario accedere/modificare la variabile lungo tutto il flusso di lavoro, attraverso diverse funzioni, allora è meglio sull'heap. Lo libererai quando non ne avrai più bisogno. Se la variabile è solo una struttura di opzioni o un contatore, lo stack è perfetto per questo.