Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Memoria heap e stack (C)

26 views
Skip to first unread message

NERO23

unread,
Apr 21, 2013, 3:53:40 PM4/21/13
to
Alcuni chiarimenti in merito alla memoria heap e stack...
Ipotizziamo di avere un programmino scritto in C il cui codice ᅵ
composto dal tradizionale main() e da due funzioni: A() e B().
All'interno della funzione A() ᅵ previsto la variabile int a e nella
funzione B() la variabile int locale b.

In fase di secuzione del programma, il sistema operativo alloca
automaticamente lo spazio per le due variabili, a e b, nello stack anche
se le due funzioni non sono state chiamate dal main?

nero23

fma...@gmail.com

unread,
Apr 21, 2013, 5:44:05 PM4/21/13
to
On Sunday, April 21, 2013 9:53:40 PM UTC+2, NERO23 wrote:
> Alcuni chiarimenti in merito alla memoria heap e stack...
> Ipotizziamo di avere un programmino scritto in C il cui codice è
> composto dal tradizionale main() e da due funzioni: A() e B().
> All'interno della funzione A() è previsto la variabile int a e nella
> funzione B() la variabile int locale b.
>
> In fase di secuzione del programma, il sistema operativo alloca
> automaticamente lo spazio per le due variabili, a e b, nello stack anche
> se le due funzioni non sono state chiamate dal main?
>

Come primissima cosa, se una funzione non è chiamata dal probabilmente il
compilatore la scarta, e non va a finire nell'eseguibile finale.

Detto questo, lo stack è gestito diversamente da ogni sistema operativo, per
cui adesso prendo in considerazione solo il sistema "classico" di stack, così
com'è implementato sugli *nix o win.
Lo stack è un'area di memoria allocata dal sistema operativo ogni volta che
parte un programma, la cui dimensione è o fissa o decisa in base ad un valore
che si trova nell'eseguibile stesso. Lo stack quindi è sempre allocato, e si
riempie.. come uno stack (si fa push/pop di valori e visivamente è come
se si riempisse "al contrario", dall'alto al basso).
Ogni volta che chiami una funzione, il contesto necessario e le varabili
locali sono messe sullo stack (un push), che si riempie un pochino di più:
all'uscita della funzione, questa sottrarrà allo stack quello che ha messo
all'inizio, lasciandolo nella stessa situazione di quando è stata chiamata.

Spero sia un po' più chiaro ;)

Ciao!

enoquick

unread,
Apr 21, 2013, 6:13:02 PM4/21/13
to
Il 21/04/2013 14:53, NERO23 ha scritto:
> Alcuni chiarimenti in merito alla memoria heap e stack...
> Ipotizziamo di avere un programmino scritto in C il cui codice è
> composto dal tradizionale main() e da due funzioni: A() e B().
> All'interno della funzione A() è previsto la variabile int a e nella
> funzione B() la variabile int locale b.
>
> In fase di secuzione del programma, il sistema operativo alloca
> automaticamente lo spazio per le due variabili, a e b, nello stack anche
> se le due funzioni non sono state chiamate dal main?
>
> nero23

Se ci pensi bene capisci che non può essere altrimenti la ricorsività va
a farsi benedire
Quindi la posizione iniziale delle variabili locali deve essere relativa
ad un indirizzo di memoria variabile.
In genere è lo stack pointer che contiene l' indirizzo da cui partire
per allocare le variabili locali
Variabili che vengono allocate quando parte la funzione

P.S.
In genere con l' ottimizzatore attivo il compilatore puo eliminare le
variabili e le funzione statiche (quindi locali ad un modulo e non
visibili all' esterno) non usate
Poi il passaggio va al linker il quale può eliminare le variabili e le
funzioni non usate in tutto l' eseguibile.



0 new messages