Vai al contenuto

[RISOLTO] Programmazione: Dubbione sulla compilazione.


Messaggi Raccomandati:

Guest frallog
Inviato

Vi espongo un mio personale dubbio, perche' vi ho visto molto esperti in ambito informatico.

Per semplicita' e per fissare le idee mi riferiro' alla programmazione da linguaggio C, ma i discorsi potrebbero essere portati ugualmente per i linguaggi del Pascal, del Fortran (quello moderno, con i puntatori e le allocazioni dinamiche di memoria) ed altri.

Un programma ha fondamentalmente due tipi di variabili:

a) Quelle allocate nelle sezioni globali (global section)

B) Quelle allocate nelle sezioni locali a una routine od una funzione (local section)

Le prime sono variabili visibili in qualunque punto del programma, mentre le seconde sono tipicamente allocate sullo stack all'interno di uno scope e l'area di memoria ad esse dedicata viene normalmente deallocata alla chiusura dello scope, quando lo stack per l'appunto si svolge. Le prime corrispondono a variabili C dichiarate global o static o piu' semplicemente anche a variabili dichiarate automatic ma al di fuori dallo scope del main (cioe' al di fuori di tutti gli scope). Le seconde sono appunto variabili implicitamente od esplicitamente dichiarate automatic all'interno di uno scope di una funzione.

Ed adesso veniamo al dunque.

Parliamo delle variabili globali o statiche. Ci sono fondamentalmente due modi per scrivere in un assoluto (cioe' in un eseguibile) l'allocazione dedicata alle variabili e cioe'

a) Scrivere l'indirizzo di memoria e la quantita' di byte da allocare per la variabile

B) Scrivere l'indirizzo di memoria e poi preallocare nell'eseguibile una sequenza di byte che verranno mappati in memoria a tempo di esecuzione (at run time) all'indirizzo prescelto per la variabile. In Unix ad esempio questo corrisponderebbe a mappare dentro l'eseguibile diversi shared segment in corrispondenza delle variabili staticheo globali.

Per quanto possa sembrare strano la mia impressione personale e' che molti sistemi facciano uso del metodo (B). Questo significa in altre parole che all'atto della compilazione deve essere effettuata una mappa in memoria per tutte le variabili di tipo statico o globale, mappa che poi viene riversata direttamente nell'eseguibile. Se questo e' vero allora su sistemi di sviluppo del software se ci sono molti programmi che dichiarano sezioni globali per variabili di dimensioni corpose, allora la compilazione concorrente dei programmi potrebbe portare ad un utilizzo consistente della memoria virtuale.

Chi sa se viene utilizzato il metodo (a) od il metodo (B) ?

Opinioni in merito sono gradite.

Regards,

Francesco 8)

Guest frallog
Inviato

Egregi solo per dire che ho provato or ora su Linux e la cosa non e' cosi'. Ho scritto un breve eseguibile con una variabile definita una volta static char[50] ed una volta static char[500000] in cui ho inizializzato anche alcuni valori e per sicurezza mi sono fatto fare la printf della stringa, cosi' che il compilatore non potesse prendermi in giro (sapete accade con i compilatori furbi quando si accorgono che le variabili non sono inizializzate o non sono usate).

La dimensione dell'eseguibile non cambia: 11k.

Dunque almeno su Unix sembra essere vera l'ipotesi (a).

Regards,

Francesco 8)

Guest frallog
Inviato

Non ti preoccupare Autodeltone! Forse ho sbagliato io, anche se pero' mi rimane l'idea fissa che una mappa di memoria viene fatta in compilazione per tutte le variabili statiche o globali. Mappa che viene tirata su dall'image activator all'inizio dell'esecuzione prima di far partire qualunque istruzione eseguibile.

Regards,

Francesco 8)

Ospite
Questa discussione è chiusa.
×
×
  • Crea Nuovo...

 

Stiamo sperimentando dei banner pubblicitari a minima invasività: fai una prova e poi facci sapere come va!

Per accedere al forum, disabilita l'AdBlock per questo sito e poi clicca su accetta: ci sarai di grande aiuto! Grazie!

Se non sai come si fa, puoi pensarci più avanti, cliccando su "ci penso" per continuare temporaneamente a navigare. Periodicamente ricomparità questo avviso come promemoria.