2010-06-20 6 views
10

So che ci sono sezioni come Stack, Heap, Codice e Dati. Stack/Heap usano la stessa sezione di memoria che possono crescere indipendentemente? Cos'è questa sezione di codice? Quando ho una funzione è una parte della pila o la sezione del codice? Inoltre, cos'è questo segmento di dati inizializzato/non inizializzato?Come è il layout di memoria di un programma C/C++?

Sono disponibili solo sezioni di memoria? Quando ho una variabile const, ciò che sta realmente accadendo è che il compilatore contrassegna una sezione di memoria come sola lettura o la inserisce in una sezione di memoria di sola lettura.

Dove vengono conservati i dati statici? Dove sono conservati i dati globali?

Eventuali buoni riferimenti/articoli per lo stesso?

Ho pensato che le sezioni di memoria e il layout sono indipendenti dal sistema operativo e hanno più a che fare con il compilatore. Il segmento Stack, Heap, Codice, Dati [Inizializzato, Non inizializzato] si verifica in tutto il sistema operativo? Quando c'è un dato statico, ciò che sta accadendo il compilatore ha capito che è statico, che cosa succederà, che cosa farà? È il compilatore che sta gestendo il programma e dovrebbe sapere cosa fare giusto? Tutti i compilatori non dovrebbero seguire standard comuni?

+1

+1 per la curiosità e l'entusiasmo, ma miglioreresti enormemente le possibilità di ottenere risposte concrete se dovessi suddividerle in singole domande. –

+1

Sarebbe più semplice rispondere alla tua domanda se abbiamo capito perché vuoi sapere e (perché è molto specifico per piattaforma/compilatore) su quale piattaforma stai mirando. In generale, sebbene la risposta a queste domande non sia rellavent a un programmatore C++ generale (con eccezioni come compilatore/driver di dispositivo), ciò che è più importante è la durata della vita dell'oggetto e il modo in cui i diversi tipi di oggetti influenzano la durata della vita. –

risposta

3

Dipende principalmente dal sistema operativo.

Per Windows dare un'occhiata ai libri di Petzold o Richter. Per Linux puoi leggere la fonte!

+0

Leggi la fonte? Sembra molto simile a RTFM: p –

+0

Penso che abbia bisogno di aiuto con Reading The F'ing Memory;) – MSalters

+0

@ Matthieu M Ho inserito un "!" ;-) –

3

per quanto ne so:

Pila/mucchio Usano la stessa sezione di memoria in quanto possono svilupparsi in modo indipendente?

Possono crescere autonomamente.

Cos'è questa sezione del codice?

Un segmento di sola lettura in cui sono memorizzati i dati di codice e const.

Quando ho una funzione è una parte della pila o la sezione di codice?

La definizione (codice) della funzione sarà nel CS. Gli argomenti di ogni chiamata vengono passati in pila.

anche che cosa è questo inizializzate dati/non inizializzate segmento?

Il segmento dati è il punto in cui sono memorizzate le variabili globali/statiche.

Sono disponibili solo leggere la sezione di memoria ?

Il segmento di codice. Suppongo che alcuni del sistema operativo potrebbero offrire le primitive per la creazione di segmenti personalizzati di sola lettura.

Quando ho una variabile const, ciò che sta realmente accadendo è che il compilatore segna un sezione di memoria come sola lettura o ha messo in una sola sezione di memoria lettura.

Va nel CS.

Dove vengono conservati i dati statici? Dove sono conservati i dati globali ?

Il segmento dati.

+0

I segmenti di sola lettura erano molto popolari con le prime versioni di Windows, ti consentono di eseguire più copie di un'app senza utilizzare molta memoria scarsa. Anche le risorse di stringa sono finite in segmenti condivisi di sola lettura. –

6

C'è molto poco che sia effettivamente definitivo sui layout di memoria C++. Tuttavia, la maggior parte dei sistemi operativi moderni utilizza un sistema in qualche modo simile e i segmenti sono separati in base alle autorizzazioni.

Il codice ha il permesso di esecuzione. Gli altri segmenti no. In un'applicazione Windows, non puoi semplicemente mettere un codice nativo nello stack ed eseguirlo. Linux offre le stesse funzionalità: è nell'architettura x86.

I dati sono dati che fanno parte del risultato (.exe, ecc.) Ma non possono essere scritti. Questa sezione è fondamentalmente dove vanno i letterali. Solo i permessi di lettura in questa sezione.

Questi due segmenti fanno parte del file risultante. Stack e heap vengono allocati al runtime, anziché mappati dal disco rigido.

Lo stack è essenzialmente uno, grande (1 MB o così, molti compilatori offrono un'impostazione per esso) allocazione dell'heap. Il compilatore lo gestisce per te.

La memoria di heap è memoria che il sistema operativo restituisce all'utente attraverso un processo. Normalmente, heap è un heap (la struttura dati) di puntatori per liberare i blocchi di memoria e le loro dimensioni. Quando ne chiedi uno, ti viene dato. Sia le autorizzazioni di lettura e scrittura qui, ma nessuna esecuzione.

C'è una memoria di sola lettura (ROM). Tuttavia, questa è solo la sezione Dati. Non è possibile modificarlo in fase di esecuzione. Quando si crea una variabile const, nella memoria non accade nulla di speciale. Tutto ciò che accade è che il compilatore creerà solo determinate istruzioni su di esso. Questo è tutto. x86 non ha conoscenza o nozione di const- è tutto nel compilatore.

+4

Molto di ciò che hai scritto, ad es. "stack è essenzialmente una grande allocazione dell'heap" o "x86 non ha nozione di' const' ", è male impreciso. Apprezzo che tu stia cercando di spiegarlo senza parlare dell'indirizzamento virtuale, ma la memoria virtuale è davvero la chiave per capire come funziona tutto questo. Soprattutto le tabelle di pagina, che sono dove sono definite le autorizzazioni di ogni sezione. E ovviamente tutto questo varia * in modo significativo * su processori non-x86. –

+1

Sono pienamente consapevole dell'indirizzamento virtuale. Come hai detto, sto cercando di mantenerlo semplice. – Puppy

0

(Nota: Quanto segue si applica Linux)

La pila e mucchio di un processo a livello esiste nel "stessa" parte della memoria di un processo. Lo stack e l'heap crescono uno verso l'altro (inizialmente, all'avvio del processo, lo stack occupa l'intera area che può essere occupata dalla combinazione dello stack e dell'heap; ogni allocazione di memoria (malloc/free/new/delete) può spingere il limite tra lo stack e l'heap in alto o in basso). La sezione BSS, anch'essa situata nello stesso spazio del processo assegnato dal sistema operativo, si trova nella sua sezione e contiene variabili globali. I dati di sola lettura si trovano nella sezione dei rodata e contengono elementi come stringhe letterali. Ad esempio, se il codice ha la riga:

char tmpStr[] = "hello"; 

Poi, la parte del codice sorgente contenente "ciao" risiederà nella sezione Rodata.

Un buon libro completo su questo è Computer Systems di Randall E. Bryant.

+1

Lo stack NON occupa l'intero spazio degli indirizzi. In effetti, è un errore parlare dello stack "the", perché ogni thread ha il proprio stack e potrebbero esserci stack aggiuntivi aggiuntivi per la gestione dei segnali, il ripristino degli errori, ecc. –

+0

Quello che ho concluso è che lo stack occupa l'intero spazio degli indirizzi che può essere occupato dalla combinazione dello stack e dell'heap. – jrupac

0

Ero nello stesso dilemma quando stavo leggendo sul layout di memoria di C/C++.Ecco il link che ho seguito per chiarire le domande.

http://www.geeksforgeeks.org/memory-layout-of-c-program/

illustrazione principale del collegamento si aggiunge qui:

enter image description here

Spero che questo aiuta 'quello' trovare risposte alle domanda simile.

+1

La pubblicazione di risposte di solo collegamento può diventare inutile per i futuri utenti di StackOverflow se il collegamento non funziona. Prova e includi i punti importanti del link nella risposta stessa –

+0

Grazie per il consiglio. Certo da seguire. Questa è stata la mia prima risposta :-) –

Problemi correlati