Cos'è VLA e come è implementato?

0

La maggior parte delle lingue supporta matrici di lunghezza variabile nello heap ma ho sentito che anche queste possono essere memorizzate nello stack. Sono curioso quali lingue supportano questo costrutto, alcuni esempi e come vengono implementati?

Preferirei esempi da lingue moderne in quanto non voglio codificare in legacy (come 'C', ecc.).

    
posta Cplusminus_is_coming 19.04.2015 - 12:59
fonte

2 risposte

10

Il termine "array a lunghezza variabile" è in realtà specifico per C, ma sembra che tu sia principalmente interessato all'allocazione dello stack dinamico. Per rivedere, i VLA sono una funzionalità aggiunta in C99 (quindi resa opzionale in C11) che consente di dichiarare una matrice con una dimensione sconosciuta fino al runtime. Ciò significa che il linguaggio deve allocare spazio in fase di esecuzione una volta che sa quale sia la dimensione. Non viene specificato se questa allocazione di runtime viene eseguita nell'heap o nello stack. GCC capita di usare lo stack, ma non è obbligatorio.

Quindi dal punto di vista di un avvocato della lingua, la risposta corretta è probabilmente "nessuna lingua" perché non sono a conoscenza di alcuna caratteristica standard in qualsiasi lingua che deve essere implementata tramite l'allocazione dello stack . Da un punto di vista pratico, ho l'impressione che questa sia una caratteristica C specifica (molte persone vedono questo come una sostituzione standard per la funzione alloca() ), e l'allocazione dello stack dinamico non è generalmente vista come una funzionalità accattivante o desiderabile per altre lingue, in parte perché è molto facile far esplodere lo stack con esso, aggiunge un'ulteriore complicazione alla gestione della memoria, e non c'è molto di un bisogno per averlo nel primo posto.

Se ti interessano principalmente le lingue "moderne", molte di queste sono spazzatura oggigiorno, quindi se l'allocazione heap / stack / static / cloud / ether viene utilizzata è un dettaglio di implementazione che non dovresti (quasi) mai avere pensare a. Non credo che Rust, Go o Swift abbiano l'allocazione di stack esplicita (anche quelli che consentono di ignorare le dimensioni di un array fino a quando il runtime sembra considerare tale array più simile a un vettore std :: che a un array "raw" ).

    
risposta data 19.04.2015 - 13:41
fonte
3

In cima a lxrec's bella risposta, non esiste una serie contigua a pila di tipo variabile del tipo di cui penso tu stia parlando dato che sarebbero troppo poco pratici. Esistono VLA in C che possono allocare una quantità sufficiente di spazio nello stack in base a una dimensione determinata in fase di esecuzione, ma non sono contenitori ridimensionabili e di dimensioni variabili del tipo che immagino tu abbia in mente.

Non è molto pratico avere strutture di dati contigui ridimensionabili usando lo stack, dal momento che non lo renderebbe più uno stack. Se hai allocato un grande array sullo stack e poi hai provato a realloc e lo hai ridotto ad una dimensione più piccola, che cosa succederà lo stack se ci sono dati memorizzati alla fine dell'array (ad esempio dallo stack spill)? E come farà a fare spazio se l'array cresce?

Tutte queste domande portano a qualcosa di molto più complicato di uno stack e alla fine sconfiggono lo scopo della pila che ha il fascino di spingere semplicemente i dati e farli scoppiare in modo simmetrico. Una struttura collegata basata sullo stack, come una lista libera che utilizza una quantità limitata di spazio massimo (magari usando l'heap dopo che si esaurisce), potrebbe essere più fattibile di una che ha lo scopo di essere ridimensionabile e perfettamente contigua.

Probabilmente potresti diventare davvero fantasioso e progettare linguaggi che graffiano il metallo attorno a quell'idea, ma la struttura non sarebbe perfettamente contigua se vivesse in pila se dovesse crescere oltre una certa dimensione. Per lo meno dovrebbe dividere in due blocchi (uno in pila, uno in heap) o spostarsi interamente nell'heap dopo quel punto.

    
risposta data 13.12.2017 - 08:59
fonte

Leggi altre domande sui tag