Allocazione memoria in C su Linux

hee136
La memoria di un processo è così organizzata:
------------------------------
| Indirizzo | Contenuto |
------------------------------
| Max ------| Stack ----- |
| ---------- | ------------- |
| ---------- | Heap ------ |
| ---------- | Data ------- |
| 0 -------- | Text ------- |
------------------------------

In Data ci sono le variabili allocate staticamente?
Se nel codice scrivo "int z", allora z si troverà in Data?

Risposte
hamming_burst
Ciao,
aspetta aspetta non fare salti nelle astrazioni.
Di che parliamo:
- della struttura processo
- della suddivisione logica del codice C
- dell'allocazione in memoria del codice logicamente suddiviso

il tuo titolo dice una cosa, ma il post un'altra spiega meglio il tuo dubbio :-)

hee136
"hamming_burst":
Ciao,
aspetta aspetta non fare salti nelle astrazioni.
Di che parliamo:
- della struttura processo
- della suddivisione logica del codice C
- dell'allocazione in memoria del codice logicamente suddiviso

il tuo titolo dice una cosa, ma il post un'altra spiega meglio il tuo dubbio :-)


Spero di essere maggiormente chiaro.
Parliamo della struttura del processo. Appena un eseguibile viene eseguito, il codice sorgente (text) viene caricato in memoria e gli viene allocata una zona di memoria (data, heap e stack).

hee136
"Sergio":
[quote="hee136"]Se nel codice scrivo "int z", allora z si troverà in Data?

Puoi scrivere "int z" in tanti contesti. Ad esempio, se è una variabile locale andrà nello stack.[/quote]

void main() {
int z = 12;
...
}


Così va a finire in Data?

hee136
"Sergio":
[quote="hee136"]Così va a finire in Data?

Che io ricordi, no. Così:
int z = 12;

void main() {
...
}

sicuramente sì.[/quote]

Grazie :-)

Se ci fossero due o più variabili, sono allocate una dopo l'altra?
Ipotizzando che un int occupi 4 byte, è corretto quanto scritto sotto?

int z1 = 12; -> z1 allocata nelle celle di memoria 1,2,3,4
int z2 = 98; -> z2 allocata nelle celle di memoria 5,6,7,8

void main() {
...
}


Nel caso che avevo scritto io, vanno a finire nello Stack?
Se ci fossero due o più variabili, in che modo vengono allocate?

ramy1989
Mentre tutto cioò che è allocato dinamicamente con malloc e calloc va nello heap (correggetemi se sbaglio).

hamming_burst
visto che Sergio ti ha consiglio di passare per il compilatore, consiglio di leggerti cosa è una "sezione" e lo standard ELF.
per un mini sunto su tutto questo:
- http://ar.linux.it/docs/A-C-X-more-en.html (v. Memory allocation) by Rubini
- http://ar.linux.it/docs/A-C-X-en.html by Rubini
- http://sourceware.org/binutils/docs-2.1 ... l#Sections by GNU Assembler

secondo me così ti chiarisci cosa davvero accade nella compilazione, cioè preparare il terreno per l'esecuzione e la relativa creazione del processo. :-)

apatriarca
Vorrei solo aggiungere che quasi tutto quello di cui si sta discutendo dipende fortemente dal compilatore scelto (e dagli argomenti passati da linea di comando allo stesso). A patto che il risultato dell'esecuzione del codice sia conforme a quanto richiesto dallo standard, il compilatore può fare quello che vuole. Il compilatore può ad esempio eliminare parti di codice o variabili se ritiene che siano inutili e può riordinare le espressioni a piacimento (a patto che il risultato sia lo stesso). Una variabile locale può decidere di inserirla nello stack o usare semplicemente un registro. Anche se è sempre possibile sapere il comportamento del compilatore in una specifica situazione guardando il codice assembly generato, non è detto che il compilatore si comporterà esattamente nello stesso modo in un'altra situazione simile o nella stessa situazione con opzioni del compilatore diverse. In questi casi credo sia meglio evitare di fare generalizzazioni e verificare l'assembly generato nei casi specifici.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.