Ho scritto un'estensione BIOS (fondamentalmente un driver di periferica per un BIOS, scritta in assembly) per un controller host USB. - Implementare una struttura di dati apparentemente astratta di alto livello come una lista collegata in assemblea non è così difficile come sembra. - Il controller ha gestito le richieste di I/O per tastiera e disco utilizzando un elenco collegato di pacchetti nella memoria principale. Ho mantenuto un pool di pacchetti gratuiti in un'altra lista collegata. L'esecuzione dell'I/O consisteva essenzialmente nell'acquisizione di un pacchetto gratuito dall'inizio della lista gratuita, nella configurazione del pacchetto, nell'aggiunta del pacchetto all'elenco dei dispositivi e nella riaggiunta del pacchetto all'inizio del pool libero al termine dell'I/O. Gli elenchi collegati sono velocissimi per spostarsi su oggetti come questo, specialmente quando gli oggetti sono grandi, poiché gli oggetti non devono spostarsi. Solo i loro indicatori devono essere aggiornati.
Una coda basata su array avrebbe richiesto:
- utilizzando un inizio/fine puntatore indice, che è veloce, ma richiede che fissa il dimensione della coda in modo che il produttore deve aspettare quando la coda del consumatore è pieno e bloccando la coda, mentre l'intero pacchetto è piena se non v'è più di un produttore
- spostando tutti gli elementi in coda ogni volta che si inserisce/rimuovere, che è lento per oggetti di grandi dimensioni
liste Quindi, collegate sono un bel modo per implementare a n coda arbitrariamente lunga di tipo first-in-first-out di oggetti di grandi dimensioni.
Un'altra cosa da fare attenzione è che per gli oggetti piccoli o dove si allocano oggetti da un heap convenzionale invece di un pool gratuito personalizzato, gli array possono essere più veloci perché la copia non è così lenta se non viene eseguita spesso, e l'allocazione ripetuta dall'heap che una lista collegata richiederebbe ogni volta che viene aggiunto un nuovo elemento è lenta.
Ovviamente, è possibile simulare e misurare il proprio scenario particolare con un codice di prova throwaway per trovare la risposta. Mi piace eseguire cicli qualche milione di volte con elenchi e array collegati, con oggetti piccoli e grandi e tempo per quanto tempo ciascuno impiega in tempo reale. A volte sarai sorpreso.
Se in effetti leggi entrambe le domande, non è affatto un problema. La domanda correlata vuole un'analogia del mondo reale con una lista collegata, questa domanda vuole esempi reali di utilizzo di una. – mmcdole