2010-06-21 12 views
16

È una buona idea usare V99 V99? Quando è appropriato utilizzare VLA rispetto a malloc/free? (dal momento che VLA può far esplodere lo stack?)È una buona idea usare V99 VLA rispetto a malloc/free?

+9

Evitare inspiegabile TLA come VLA ... –

+17

@Thomas: il termine "VLA" * ha * un significato ben noto e ben noto nel contesto di C99. Qualcuno in grado di rispondere alla domanda saprà cosa significa. –

+0

Possibile duplicato di: http://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays –

risposta

22

Sì, tranne nei casi in cui si sa che il proprio stack può esplodere. Puoi anche modificare la dimensione dello stack, se necessario, è diverso come su ogni sistema operativo ma è possibile. I vantaggi di VLA sono:

  • veloce: regolando il puntatore stack e/o il puntatore sarebbe stato fatto comunque, quindi il costo di un VLA è quasi 0.

  • Facile: un semplice definizione, nessun puntatore da inizializzare, per controllare gratuitamente e nessun rischio di perdite di memoria.

  • È thread-safe automaticamente poiché ogni thread ha il proprio stack. Ha anche un ridimensionamento migliore in quanto non è necessario il blocco, un problema che può sorgere quando si utilizza malloc/free.

  • Leggibile: è davvero un concetto semplice, quindi è meno probabile introdurre piccoli errori.

Essa presenta alcuni inconvenienti:

  • dimensioni limitate: come già detto, la pila può esplodere.

  • Gli overflow del buffer sono un po 'più gravi rispetto alla memoria heap (si può sostenere che è un vantaggio, poiché un'applicazione in crash è migliore di una che danneggia in modo silenzioso i dati e si arresta in modo anomalo su istruzioni non correlate).

  • Portabilità: non tutti i compilatori lo implementano, ma può spesso essere simulato da alloca (attenzione la semantica è un po 'diversa ma niente di veramente serio).

+1

Se si simula l'uso 'alloca()' (+1) non puoi usare 'sizeof', che è spesso nascosto all'interno delle macro. –

3

Il vantaggio principale con l'allocazione dello stack è che si ottiene gestione automatica della memoria della matrice a lunghezza variabile allocata. Poiché la gestione della memoria è una delle sfide principali per qualsiasi programma C, dovresti sicuramente usare VLA per semplificare il tuo compito, se puoi.

Quindi sosterrò che è necessario utilizzare VLA in modo coerente quando è possibile, e in caso contrario utilizzare malloc solo se: è necessario controllare la durata dello spazio di archiviazione e se si dispone di allocazioni molto grandi e se si desidera gestire -di errori di memoria con grazia.

+0

quanto è grande 'molto grande' \ o/ –

1

C++ non supporta Vlas. Quindi sarà un po 'più difficile trasferire il codice in C++, nel caso si presentasse la necessità.

Poi di nuovo, alcuni credono questo è in realtà una buona cosa e astutamente proporre "classe" come nome meraviglioso per un simbolo in c :-)

+2

'alcuni credono che questa sia davvero una buona cosa e astutamente propongono" classe "come un meraviglioso nome per un simbolo in c :-)': Beh, quando non si può essere migliori, il modo migliore per vincere è provare a sabotare la competizione... – paercebal