Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numerici booleani alfabetic i Statici dinamici Puntatori a variabili strut te Memoria statica Heap Puntatore variabile Memoria statica Heap Puntatore variabile statica stack heap Gestione memoria 1 1 A
26
Embed
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Relazione sulle strutture dati
Svolta da: Buccella Simone
Strutture di dati
Aree di memoria
Puntatore
numerici booleani
alfabetici
Statici dinamici
Puntatori a variabili strutturate Memoria statica Heap
Puntatore variabile
Memoria statica Heap
Puntatore variabile
statica stack
heap
Gestione memoria
1
1
A
Strutture di dati
•Le strutture dei dati all´interno di un programma hanno un´importanza notevole in quanto subiscono elaborazioni, trasformazioni cambiando di valore nel loro ciclo di vita
•Le strutture dei dati possono essere classificati in diversi modi a secondo del loro utilizzo
2
A = B + 2
A 2B4
numerici booleani
alfabetici
permanenti
Staticidinamici
uscita
ingressoRichiesta
End
Inserisci numeri
1 2 3 0Ordine inverso
3 2 1
Si effettui la lettura da tastiera di un insieme di numeri terminati con uno 0 e si effettui la loro stampa a video in ordine inverso
Richiesta
Analisi problema
Occorrono 2 operazioni elementari:
- lettura
- visualizzazione
Nasce il problema sulla dichiarazione delle variabili perché non si sa a priori il numero massimo di elementi
Possibili soluzioni
End
Possibili soluzioni
Dimensionare un vettore con un valore molto elevato sperando che sia sufficiente
Limitare il numero massimo di numeri da leggere ponendo cosí un limite
Effettuare elaborazioni parziali tipo creare un vettore di dimensione 100 ed effettuare l´inversione ogni 100 numeri
10 2 3 4 10.000
10 2 3 4 500
10 2 3 100
End
Soluzione ottimale
La soluzione ideale è quella di creare variabili ogni volta che occorrono e salvare in memoria i dati ogni qualvolta che si inseriscono assegnando loro una certa locazione di memoria, in modo da non creare limiti.
Soluzione
Inserisci numeri
1 2 3 0
123
End
Gestione memoria
Puntatore
Gestione memoria
Allocazione dinamica
Allocazione statica
Consiste nel definire le variabili con nome e dimensione prima dell´inizio dell´esecuzione del programma
Consiste nel definire le variabili al momento opportuno mediante l´utilizzo di una funzione che consente al programma di interagire con il sistema operativo, per conoscere lo spazio di memoria utilizzabile
1
Variabile A locazione 1
A
1?
Quale locazione è
libera
1
A
Locazione 1
End
Aree di memoria
Aree di memoria
La locazione di memoria varia a secondo del tipo di variabile ed è suddivisa in 3 aree
•Memoria statica : è utilizzata per le variabili globali visibile quindi da tutti i sottoprogrammi
•Stack: è utilizzata per memorizzare i dati dei sottoprogrammi e dalle funzioni che man mano vengono mandate in esecuzione
•Heap: è utilizzata per memorizzare le variabili create dinamicamente mediante una particolare funzione (new) che assegna ad esse una determinata locazione di memoria
End
Puntatore
Per allocare le variabili in modo dinamico, il programma deve chiedere al sistema operativo la posizione di memoria libera per essere utilizzata. Queste vengono allocate in maniere sequenziale e la loro posizione è variabile, per cui occorre un qualcosa che associ ad ogni variabile l´indirizzo della loro locazione di memoria. Definiamo quindi il Puntatore un tipo di variabile che contiene l´indirizzo del primo byte di una variabile dinamica.
Puntatore
1?
Quale locazione è
libera
1
A
Locazione 1
1Puntatore
End
Definizione
Inizializzazione
Creazione
Accesso indiretto
Assegnazione
Rilascio della heap
Come tutte le variabili, per definire un puntatore occorre assegnare:
• un nome
• Il tipo della variabile che andrá a puntare
Definizione
double* p_d;
int* p_i;
char* p_c;
float* p_f;C++
type IntegerPointer = ^Integer
var B : ^Integer
Pascal
End
Inizializzazione
Nel momento della definizione, quindi dell´avvio del programma, le variabili di tipo puntatore contengono un indirizzo non significativo, cioè di nessun interesse, oppure il valore 0. Per evitare ambiguitá inizializziamo tale puntatore con una particolare istruzione che assegna al puntatore un valore di indirizzo convenzionale.
C++Pascal
doube p_d = null;
Int* p_i = null;
char p_c = null;
float p_f = null;
IntegerPointer := null;
NIL
PuntatoreMessa a terra
potenziale nullo
End
Creazione
La creazione vera e propria della variabile dinamica, cioè dell´allocazione dello spazio all´interno della heap, avviene durante l´esecuzione del programma nel momento del bisogno. La funzione che permette al sistema di creare lo spazio necessario è new.
double* p_d = new;
int* p_i = new;
Char* p_c = new;
float* p_f = new;C++
new (IntegerPointer);
new (B);
Pascal
Memoria statica Heap
VariabilePuntatore
End
Accesso indiretto
L´accesso indiretto alla variabile dinamica si intende l´operazione che permette di scrivere il contenuto di una variabile dinamica mediante l´utilizzo della variabile puntatore che ne contiene l´indirizzo. Questa operazione prende anche il nome di dereferenziazione
10
Memoria statica Heap
VariabilePuntatore
End
Assegnazione ad una variabile dinamica
Simone
Memoria statica Heap
VariabilePuntatore
int* p_i = new;p_i = 0;
Char* p_c = new;p_c = simone;
C++
new (charPointer);charPoint^:=simone;
new (B);B^:=simone;
Pascal
End
Rilascio della heap al termine dell´utilizzo
La possibilitá di effettuare modifiche al contenuto dei puntatori, puó portare a situazioni indesiderate, facendo assumere a due puntatori lo stesso indirizzo di memoria heap si puó cosí perdere il collegamento con una variabile di memoria provocando:
• ingombro inutile della memoria heap con una variabile che rimarrá per sempre inutilizzata
soluzione
10
VariabilePuntatore
1
10
VariabilePuntatore
2
2
• perdita senza possibilitá di recupero del contenuto della variabile
End
Risoluzione a problemi di variabili del heap
•Per risolvere il problema di ingombro inutile della memoria heap è possibile farlo in due modi:
•Per ovviare al problema di perdita del contenuto della variabile se è necessario, salvare il valore in un´altra variabile dinamica o statica.
Modalitá manuale
Modalitá automatica
2A 2B
End
Modalitá manuale
double* p_d;p_d = dispose;
int* p_ip_i = dispose;
Char* p_c; p_c = dispose
float* p_f ;p_f = dispose;
C++
dispose (IntegerPointer);
dispose (B);
Pascal
La modalitá manuale consiste nel rendere nuovamente disponibile lo spazio di memoria heap quando il dato non serve piú . La funzione che permette al sistema di cancellare lo spazio é dispose.
End
Modalitá automatica
La modalitá automatica detta anche garbage collector, è un processo che si occupa di recuperare le porzioni di memoria heap inutilizzate per metterle a disposizione del programma, effettuando il compattamento delle aree libere e liberando la memoria occupata da variabili non piú utilizzate.
Memoria statica Heap
VariabilePuntatore
9
8
7
6
5
End
Puntatori a variabili strutturate
I puntatori a variabili strutturate hanno le stesse caratteristiche di quelli che puntano a semplici variabili, cambia logicamente la loro definizione.
record data:string nomegiorno[10]int giornoint meseint anno;data* comp;
C++Pascal
type data = record nomegiorno : string[10]; giorno: integer;mese: integer;anno: integer end; var comp:^data;
End
Assegnazione
Creazione
Richiesta
Creazione
record data:string nomegiorno[10]int giornoint meseint anno;data* compleanno;comp = new
C++ Pascal
type data = record nomegiorno : string[10]; giorno: integer;mese: integer;anno: integer end; var compleanno:^data; new (comp);