Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C]Classi di memoria

  1. #1

    [C]Classi di memoria

    Ciao a tutti, sono arrivato a studiare le classi di memoria delle variabili.
    Non mi e` ben chiara la differenza, forse ho capito ma non ne sono sicuro.
    Son certo che auto e` la variabile standard e che nasce e finisce all interno di una funzione.
    Mentre register proprio non riesco a capire a cosa serve.
    Static e extern sono variabili globali giusto?
    e se ho capito bene la prima si puo dichiarare dentro ad una funzione mentre la seconda solo esternamente e di default sono exetern...
    e` giusto? spero in un aiuto perche ci sto perdendo molto tempo senza capire la differenza =(

  2. #2
    Le variabili automatiche locali (teoricamente dichiarate con la parola chiave auto, ma nessuno la usa visto che basta fare una definizione "normale" all'interno della funzione) nascono e muoiono all'interno del blocco in cui sono dichiarate. Nel momento in cui si esce dal loro blocco, esse non esistono più.
    Le variabili globali si definiscono senza keyword particolari fuori da ogni funzione. Esse esistono per tutta la durata del programma.
    static ed extern sono dei modificatori, modificano cioè le definizioni/dichiarazioni di variabili.
    Se static è applicato ad una variabile locale, la variabile diventa "statica", ossia di fatto diventa una globale con scope limitato alla funzione. Ciò significa che essa è visibile solamente all'interno della funzione, ma che il suo valore persiste tra una chiamata e l'altra alla funzione; non viene cioè distrutta e ricreata ogni volta che si esce e si rientra dal suo scope. In generale l'uso di variabili locali static non è consigliato, dato che con essa risulta facile creare funzioni non rientranti.

    static applicato a variabili globali ed extern hanno a che fare con il linkage della variabile in questione.
    In C di rado si scrivono programmi che stanno interamente in un singolo file sorgente, ed è spesso necessario scambiare informazioni tra i vari file sorgenti; spesso e volentieri, quindi, è necessario condividere variabili globali a cavallo di più sorgenti.
    Per fare sì che questo sia possibile, le definizioni di variabili globali effettuate senza il modificatore static fanno sì che il compilatore inserisca una "nota" al linker dentro al file oggetto generato, che dice "guarda che qui sono definite una serie di variabili globali che si chiamano così e cosà". Negli altri sorgenti che vogliono utilizzarle, invece, si effettuano delle dichiarazioni extern relative alle variabili da "importare" dagli altri header (non si tratta di definizioni, dato che il compilatore non alloca spazio per esse nel modulo oggetto corrente). La dichiarazione in questione consente al compilatore di fare tutti i controlli sintattici del caso, e di lasciare, in tutti i punti in cui la variabile è usata, una nota al linker del tipo "guarda che qui viene usata una variabile extern che si chiama in questa maniera".
    Il linker, quando prende tutti i moduli oggetto e li collega per creare l'eseguibile finale, guarda le "note" generate dal compilatore riguardo alle variabili disponibili nei vari moduli oggetto e le usa per ricollegare le variabili extern alle variabili "vere" definite negli altri moduli oggetto.

    static applicato alle variabili globali, invece, fa sì che la variabile globale a cui è applicato non venga "esportata" dal modulo oggetto, risultando così invisibile dall'esterno. Questo se non erro dovrebbe consentire al compilatore qualche ottimizzazione in più e dovrebbe rendere i moduli oggetto più piccoli, ma soprattutto consente di definire in diversi moduli oggetto delle variabili globali con lo stesso nome senza che questo dia adito a problemi. Questo può essere utile se i vari file sono scritti da persone diverse e le variabili in questione sono dei dettagli implementativi, nascosti dall'interfaccia "pubblica" della libreria.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C]Classi di memoria

    Originariamente inviato da gennahouse
    Mentre register proprio non riesco a capire a cosa serve
    Da quel che ricordo consiglia al compilatore di memorizzare la variabile così marcata in un registro della CPU.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Come ha detto alex,siccome alloca la variabile in un registro cpu,e' piu' veloce quando deve andare a leggere il valore di quella variabile.Per cui conviene usare una register se sai che verra' usata tante volte nella funzione,tutto qua.

  5. #5
    In generale comunque i compilatori attuali se ne fregano altamente di cosa è marcato come register, dato che sono molto più abili rispetto al programmatore a decidere cosa conviene mettere nei registri.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    c'è una cosa da non sottovalutare:
    codice:
    int main (void){
    	register int aNumber = 0;
    	int * aNumberPtr =  &aNumber;
    	return 0;
    }
    Non è compilabile; infatti:
    codice:
    $ gcc main.c 
    main.c: In function 'main':
    main.c:3: error: address of register variable 'aNumber' requested
    insomma NON si può conoscere l'indirizzo di una variabile register, sia che venga messa realmente in un register oppure no.

  7. #7
    Aggiungo che invece in C++ questa limitazione è stata rimossa (è infatti presente in §6.5.3.1.1 dello standard C, mentre nell'equivalente sezione dello standard C++ non si dice nulla a proposito). D'altra parte, richiedere l'indirizzo di una variabile register ha quasi sicuramente come effetto quello di fare sì che essa non venga messa in un registro, salvo il caso di architetture dove ci si può riferire ai registri anche per indirizzo.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.