È 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?
risposta
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).
Se si simula l'uso 'alloca()' (+1) non puoi usare 'sizeof', che è spesso nascosto all'interno delle macro. –
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.
quanto è grande 'molto grande' \ o/ –
Per una buona lista di link C99-correlati (inclusi i collegamenti alle informazioni sugli array a lunghezza variabile) si veda:
Xcode ora di default da usare C99 - C99 così che cosa è?
http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html
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 :-)
'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
Evitare inspiegabile TLA come VLA ... –
@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. –
Possibile duplicato di: http://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays –