Vuoi creare un editor di testo. Forse è un sostituto moderno di Vi o una nuova versione di Blocco note. Non importa. L’obiettivo è semplice: consentire agli utenti di modificare file ASCII standard.
Pensa a quanto spesso i programmatori utilizzano effettivamente questi strumenti. È la loro interfaccia principale con la macchina. È dove i pensieri diventano codice. Naturalmente, vuoi che ti senta bene. Vuoi che sia veloce. Vuoi che gestisca il tuo flusso di lavoro specifico. Quindi, decidi di costruirne uno tuo.
Il primo ostacolo è la struttura dei dati. Come si memorizza il testo in memoria? Hai bisogno di un modo per manipolare rapidamente i personaggi. Il tuo istinto iniziale? Righe di testo.
Prendi un array. Abbastanza semplice. Una riga tipica è di 80 caratteri. Un file tipico ha forse 1.000 righe. Dichiari un array bidimensionale:
Sono 80.000 caratteri. Gestibile. Pulito.
Ma poi la realtà colpisce. Pensi ai casi limite.
Alcuni file sono enormi elenchi di log. Migliaia di righe, ciascuna lunga appena 10 caratteri.
Altri file sono dump di dati per scopi speciali. Una riga potrebbe contenere 542 caratteri che rappresentano coppie di amminoacidi in una sequenza di DNA.
E gli editor moderni ti consentono di aprire più file contemporaneamente. Diciamo che lo limiti a 10 file aperti. Imposti un limite rigido di 1.000 caratteri per riga e 50.000 righe per file.
Ora la tua dichiarazione è simile a questa:
Tu calcoli i numeri. 50.000 volte 1.000 volte 10. Sono 500 milioni di caratteri.
La maggior parte dei computer non è in grado di gestirlo. Anche con la memoria virtuale, è uno sforzo. Esegui tre istanze del tuo editor su un sistema multiutente e stai soffocando la RAM. È uno spreco eccessivo. Stai allocando spazio per lo scenario peggiore in assoluto, quando la maggior parte degli utenti sta semplicemente modificando file di 100 righe che occupano 4.000 byte.
Il problema con gli array è rigido. È necessario dichiarare in anticipo la dimensione massima in ogni dimensione. Queste dimensioni si moltiplicano. E se qualcuno prova ad aprire un file con una riga di 2.000 caratteri? Sei sfortunato. La lunghezza della linea è tecnicamente infinita. Non puoi prevederlo.
Questo è il motivo per cui esistono i puntatori.
Come i puntatori risolvono gli sprechi di memoria
I puntatori consentono di creare strutture dati dinamiche. Invece di prenotare in anticipo lo spazio statico, allochi memoria dall’heap durante l’esecuzione del programma.
Utilizzi la quantità esatta di memoria necessaria per il documento. Nessuno spreco. Quando chiudi un file, riporti quella memoria nell’heap. Altre parti del programma possono usarlo. La memoria viene riciclata.
Non si tratta solo di risparmiare spazio. Si tratta di flessibilità. Non è necessario indovinare la lunghezza massima della linea. Assegni ciò di cui hai bisogno, quando ne hai bisogno.
Se ti stai ancora chiedendo cosa sia effettivamente un byte o come “mega” e “giga” si traducono in vincoli del mondo reale, leggi su bit e byte. Poi torna indietro. Dovrai comprendere i limiti hardware per capire perché gli array statici falliscono qui.



























