Newsgroup: it.comp.lang.c++
Titolo: stack-heap [novizio]

scusate, altra domanda da ignorantone ...
non ho capito bene come funziona la gestione di heap e stack in C
che differenza c'e' fra i 2 per il programmatore?
quando faccio una allocazione dinamica di memoria, con una malloc, richiedo
dello spazio nello heap.
e sullo stack cosa ci va?
L'allocazione delle variabili dipende dal compilatore o il programmatore ne
ha il controllo ?
Le variabili register come si inseriscono in questo contesto?
grazie
geronimo

 Le variabili register come si inseriscono in questo contesto?
Consigliano al compilatore di porre il contenuto della variabile, se
possibile, direttamente in uno dei registri del processore, e non inserendo
tale variabile nello stack. Ha un uso limitato, visto che il processore piu'
diffuso ha solo 4 registri, di cui uno solo puo' essere usato per calcoli
matematici, e sono gia' sovraccarichi di lavoro. :)
*** Azimuth ***
[1] Esistono estensioni dallo standard che prevedono una allocazione
dinamica sullo stack, tipo:
int pippo(  int _dimensione ) {
    char pluto[ _dimensione ];
    ...
}
ma non sono portabili, in genere.

scusa, la mia conoscenza del C e' terra-terra ...
se non ho capito male, le variabili di cui si sa la dimensione a priori
vanno sullo stack
per capirsi, se ho:
#include <stdio.h>
int main(){
int i=0;
int j=9;
...
return 0;
}
i e j vengono messe sullo stack
e' giusto?

 e' giusto?
Si'.
*** Azimuth ***

 spazio richiesto (se c'e', oppure lavorare di memoria virtuale se non
c'e').
In genere almeno nei sistemi Unix, si parla sempre di memoria virtuale
intesa come process address space,
forse intendevi l'interazione con il sottosistema di swap.
Comunque sia, in fase di allocazione di memoria nell' heap,
il sistema operativo (Parliamo sempre di sistemi unix)  non assegna memoria
fisica al processo  ,ne tantomeno interagisce con lo Swap Subsystem ,ma si
limita ad estendere  il suo Virtual Address Space che mappera' in memoria
fisica soltanto a partire dal primo accesso in scrittura.
Ivan

 fisica soltanto a partire dal primo accesso in scrittura.
In ogni caso, aldila' della precisazione tecnica un po' OT in questo ng,
possiamo comunque affermare che il costo di allocazione su heap e' comunque
sempre maggiore del costo di allocazione su stack.
*** Azimuth ***

sempre maggiore del costo di allocazione su stack.
Certamente.
Ivan

 Io mi sono limitato a correggere un' affermazione non esatta.
Spiacente contraddirti, ma la mia affermazione era esatta, e te la riporto:
    "ogni allocazione coinvolge il sottosistema C++ - sistema
    operativo che devono elaborare la richiesta e metterti a disposizione lo
    spazio richiesto (se c'e', oppure lavorare di memoria virtuale se non
    c'e')."
Che i sistemi Unix delazionano la disponibilita' REALE della memoria
richiesta a posteriori e' solo un dettaglio implementativo -- comunque, il
sistema operativo deve metterti a disposizione lo spazio richiesto. Inoltre,
se la memoria fisica disponibile termina, e' necessario utilizzare una
memoria non fisica, ovvero quella virtuale.
Ciao.
*** Azimuth ***


Confondi la terminologia.
Sotto Unix  non si accede mai all memoria fisica direttamente, ma la memoria
viene indirizzata tramite la page table del processo utilizzando virtual
address.
Quello che tu continui a chiamare "memoria virtuale", in unix si chiama area
di swap....
Spero di essermi chiarito.
Ivan

 address.
Tutto cio' il processo non lo sa.
Il processo vede la memoria, indipendentemente dalle traduzioni tramite le
page table, come un'unica estensione contigua. Se il processo chiede al
sistema operativo un'area di memoria di, diciamo, 100 Kb, su cui
leggere/scrivere, quest'area dovra' essere messa a disposizione per il suo
uso. Gia' questa procedura di richiesta preventiva e' sicuramente piu' lenta
che reclamare la stessa quantita' togliendola allo stack (che dovrebbe
essere gia' stato allocato in partenza). In piu', se tale richiesta supera
la disponibilita' della memoria, il processo viene ulteriormente rallentato.
Ciao.
*** Azimuth ***


Il processo non viene rallentato al momento della richiesta(Almeno in SO
Unix Like) , ma soltanto se comincia ad indirizzare immediatamente tutta
l'area richiesta in scrittura.
Comunque interrompiamo qui'  siamo abbastanza OT,tanto ci siamo capiti.
Ivan