Questa domanda dipende dal numero di variabili utilizzate. Dato che non hai specificato quale compilatore o linguaggio o sistema operativo, è difficile da definire! Tutto dipende dal sistema operativo responsabile della gestione della memoria delle applicazioni. In breve, non esiste una risposta definitiva a questa domanda, pensate a questo, il compilatore/linker in fase di esecuzione, richiede al sistema operativo di allocare un blocco di memoria, che l'allocazione dipende da quante variabili ci sono, quanto sono grandi, la portata e l'uso delle variabili. Per esempio, questo semplice programma C, in un file chiamato simpletest.c
:
#include <stdio.h>
int main(int argc, char **argv){
int num = 42;
printf("The number is %d!\n", num);
return 0;
}
Supponendo l'ambiente si è basata Unix/Linux ed è stato compilato in questo modo:
gcc -o simpletest simpletest.c
Se si dovesse emettere un objdump
o nm
sull'immagine binaria simpletest
, vedrai le sezioni dell'eseguibile, in questo caso, 'bss', 'testo'. Prendi nota delle dimensioni di queste sezioni, ora aggiungi un codice int var[100];
al codice sopra, ricompila e riemetti lo objdump
o nm
, troverai che la sezione data
è apparsa - perché? perché abbiamo aggiunto una variabile di un tipo di array di int, con 100 elementi.
Questo semplice esercizio dimostrerà che le sezioni crescono, e quindi il binario si ingrandisce, e dimostrerà anche che non è possibile stabilire quale quantità di memoria verrà allocata poiché l'implementazione del runtime varia dal compilatore al compilatore e dal funzionamento sistema al sistema operativo.
In breve, il sistema operativo chiama lo scatto sulla gestione della memoria!
Grazie per la procedura dettagliata dettagliata! Tuttavia, rimane un problema per me: come hai stabilito che la prima intestazione del programma corrispondeva al segmento di codice del processo e la seconda al suo segmento di dati? Convenzione? Il fatto che uno sia RO (odori come .code) e l'altro è RW? (Cosa succede se c'erano due sezioni RO o due RW?) – U007D
Sì, è una regola, e anche il primo segmento è contrassegnato come eseguibile, quindi questo deve essere __code__. – 4pie0