Ciao e bentornato. In questa conferenza, voglio parlare dell'allocazione dinamica della memoria.
Questo è direttamente correlato ai puntatori, puoi utilizzarlo solo
sui puntatori. Quindi iniziamo.
Pertanto, ogni volta che si definisce una
variabile in c, il compilatore alloca automaticamente la quantità di memoria corretta in base al tipo di dati.
L'abbiamo visto dappertutto. Quando creiamo interi, float, double, non dobbiamo allocare memoria.
Il compilatore lo fa per te. In realtà alloca un po 'di memoria.
Lo stesso vale per i puntatori, comunque. Quando crei un puntatore, la memoria viene
allocata per te, in modo che memorizzi un tipo di puntatore, un indirizzo.
Ciò non significa che la memoria sia allocata per quell'indirizzo.
Fino a questo punto, ogni volta che assegniamo dati a -
a un puntatore, abbiamo sempre assegnato una variabile esistente.
Quindi, se volessimo assegnare dati
a un puntatore, abbiamo utilizzato l'indirizzo e commerciale dell'operatore su
una variabile per la quale era già allocata memoria.
Ma se volessi creare un puntatore e non volessi assegnargli l'indirizzo
dell'operatore, volessi allocare dinamicamente la memoria. Ecco di cosa parla l'intera conferenza.
Quindi è spesso desiderabile essere in grado di allocare dinamicamente lo spazio di archiviazione mentre
un programma è in esecuzione. Alloca la memoria quando ne hai bisogno.
Se hai un programma progettato per leggere un insieme di dati da un
file in un array in memoria, hai tre scelte.
È possibile definire l'array per contenere il numero massimo di elementi possibili che si compilano,
è una dimensione fissa.
Se definisci l'array che ha 50 elementi,
conterrà solo 50 elementi. Il compilatore determina che è 50,
allocherà così tanta memoria quando viene eseguito.
È possibile utilizzare un array di lunghezza variabile per dimensionare la dimensione del runtime dell'array.
Abbiamo parlato un po 'di questi array a lunghezza
variabile, non sono supportati fino a C11. In realtà stanno eliminando C11, aggiungono C99.
Qui è dove puoi inserire le variabili.
Ma queste sono ancora una sorta di dimensione fissa perché
tutto ciò significa array collegati a variabili tutto ciò che significa è che puoi passare variabili per dimensioni.
Ma sono ancora statici.
Oppure la scelta migliore è che puoi allocare l'array dinamicamente quando ne hai bisogno.
E ci sono diverse funzioni c che puoi chiamare per farlo.
Quindi sarà molto utile essere in grado di allocare dinamicamente la memoria.
Quindi, con il primo approccio che abbiamo fatto fino ad ora, che si tratti di
un array o di un tipo di dati, è una dimensione fissa.
Devi definire il tuo array per contenere il numero massimo di elementi che
saranno a destra in un array.
Quindi dovresti fare qualcosa di simile, int dataArray [1000].
Ciò significa però che il file di dati non può contenere più di mille elementi.
Se lo fa, il tuo programma si interromperà.
Quindi devi solo sperare che il file in cui stai leggendo non abbia molti dati.
Il tuo programma non funzionerà con grandi gruppi di file o file di grandi dimensioni.
E se vuoi lavorare con file di grandi dimensioni devi tornare indietro e devi ingrandire l'array.
Devi cambiare la dimensione,
ma poi devi ricompilarlo su tutta quella roba, è tempo di compilazione.
Indipendentemente dal valore selezionato, hai sempre la possibilità di
incorrere nuovamente nello stesso problema in futuro perché è una dimensione fissa.
Questa dimensione viene determinata quando si compila il codice,
non viene modificata quando si esegue il programma.
Non cambia dinamicamente.
Utilizzando le funzioni di allocazione dinamica della memoria, puoi ottenere lo spazio di archiviazione quando ne hai bisogno.
Questo approccio consente di allocare memoria durante l'esecuzione del programma.
Quindi pensa ai vantaggi di questo. Prima di tutto
non crei un sacco di memoria che
potresti non usare, creerai solo quanto ti serve.
E se hai bisogno di più, puoi allocare di più.
Non è necessario tornare indietro e ricompilare e modificare le dimensioni.
Quindi l'allocazione dinamica della memoria è la strada da percorrere.
Dipende dal concetto di puntatore e fornisce
un forte incentivo a utilizzare i puntatori nel codice.
Quindi abbiamo parlato dei vantaggi dei puntatori e
potresti aver pensato bene, ok, sono un concetto interessante ma perché dobbiamo usarli,
questo è uno dei
motivi principali, in modo da poter allocare la memoria in modo dinamico.
E ancora, cos'è questo - C significa essere un linguaggio efficiente e non
usare una tonnellata di memoria.
Quindi c gira su sistemi embedded, programmazione in tempo reale e
questo è uno dei motivi perché puoi limitare la quantità di memoria
che usi in base alle necessità.
Pertanto, l'allocazione dinamica della memoria consente l'allocazione dinamica della memoria per l'archiviazione dei dati
durante l'esecuzione del programma.
L'allocazione dinamica della memoria è possibile solo perché
sono disponibili dei puntatori.
Poiché hai un indirizzo e puoi
modificare la quantità di puntamento del puntatore, puoi riadattare la memoria.
La maggior parte dei programmi di produzione utilizzerà l'allocazione dinamica della memoria.
Se stai scrivendo codice in c, lo userai.
Anche se sei un principiante, utilizzerai l'allocazione
dinamica della memoria. La maggior parte dei programmi utili impiegherà questo concetto.
L'allocazione dinamica dei dati consente di creare puntatori in fase di esecuzione
sufficientemente grandi da contenere la quantità di dati necessaria per l'attività, in
modo da non sprecare memoria. Vitale.
Dobbiamo anche parlare dell'heap rispetto allo stack.
Esistono due modi in cui è possibile memorizzare la memoria in un programma, due
diverse strutture di dati in cui è possibile memorizzare i dati nello stack oppure è possibile archiviare
i dati nell'heap.
L'allocazione dinamica della memoria riserva tutto sull'heap.
Non entreremo nei dettagli di come sono organizzati, ma essenzialmente.
Quando si archiviano i dati nell'heap, è possibile apportare
ulteriori modifiche.
È possibile modificare arbitrariamente la dimensione degli oggetti di dati e rimane
molto più a lungo quando si alloca la memoria in
un mucchio, si attacca all'intero programma.
Quando usi una pila, è più limitante.
Lo stack viene utilizzato per qualsiasi cosa, dagli argomenti delle funzioni alle variabili locali.
È lì che vengono archiviati tutti quelli.
Ed è per questo che abbiamo parlato dello stack di chiamate.
Ha esaminato metodi
e funzioni. Di tanto in tanto uso metodi, ma metodi è in realtà un termine
orientato agli oggetti, quindi funziona.
Tutto ciò che riguarda le funzioni viene creato nello stack.
Quindi ciò che significa è che quando esegui
una funzione, questa viene messa in pila. Le variabili locali vengono messe in pila.
Quando esci dalla funzione, tutto viene eliminato.
Quindi la memoria che si trova nello stack non rimane a lungo.
Questo è uno dei motivi per cui allochi dinamicamente
la memoria è
nell'heap perché controlli quando la usi e quando non la usi, la allochi e la elimini.
Cose in pila, non controlli. Viene automaticamente
eliminato, viene assegnato automaticamente.
Quindi le variabili locali, le variabili all'interno di funzioni come la main,
vengono create nello stack e così via.
La memoria nell'heap è diversa, è controllata da te, il programmatore.
Quando si alloca la memoria sull'heap, sta a te tenere traccia di quando la memoria che
hai allocato non è più necessaria, quindi devi eliminare la memoria.
Devi liberare lo spazio
quando non è più utilizzato da te. E questo è importante
perché la memoria è una risorsa molto, molto scarsa.
Oggi abbiamo molta memoria per far funzionare un computer, 12 giga, 16
giga qualunque essa sia. Ma per i
programmi incorporati in esecuzione su dispositivi, non
hai necessariamente molta memoria. E quindi vuoi controllare la quantità di
memoria utilizzata e vuoi anche liberare la memoria quando hai finito di usarla in
modo che altre applicazioni possano usarla.
Ancora una volta, più importante nei sistemi di tipo embedded di basso livello.
Ma questa è una libertà che molte lingue non hanno. Questa capacità di controllare
la memoria del tuo manager da parte del programmatore e può
rendere il programma molto più efficiente e molto più veloce.
Quindi nella prossima lezione parleremo di come puoi
effettivamente farlo, quali funzioni puoi invocare. Ovviamente, ci sono diverse funzioni che puoi
chiamare per allocare memoria in memoria libera. Grazie.