Vorrei un chiarimento sulle classi di memoria

di il
5 risposte

Vorrei un chiarimento sulle classi di memoria

Come da titolo, mi sono un attimo smarrito negli attributi delle variabili ( e variabili locali) e dei nomi di funzione, insomma sugli identificatori. Esposizione: il fatto è che esistono 4 classi di memoria, che individuano quanto un identificatore esista in memoria, o non sia caricato direttamente nella nella stessa. Dunque il dubbio nasce dalle fasi della programmazione ovvero:
L'Editing, quando si scrive il codice nel programma.
Compilazione = quando il programmatore inserisce il comando di compilazione(che varia da o.s.)e prima che sia iniziata la traduzione, verrà letto il preprocessore, col relativo file di intestazione al fine di tappare i buchi dei nomi di funzione, con l'ausilio del linker, ottenuto poi il codice oggetto, avrò l'eseguibile a.out..ora la fase importante...il caricamento = cioè, con i comandi appositi caricare all'interno della ram l'intero programma tradotto..ed è qui il dubbio...questo è vero quando di default le variabili sono, secondo la classe di memoria, con parola chiave "auto", ma comporta uno svantaggio, cioè quello che prima il tutto è caricato in ram, poi ogni singola variabile nel registro cpu per elaborare il dato, e poi rispedito nella ram, nell'apposito cassettino.
Ora, però...viene spiegata la parola chiave "register", dove mi dice che, "suggerisce" al compilatore di registrare in uno dei cassetti della CPU la variabile, e la domanda è...ma in quale fase della programmazione???cioè, durante la compilazione con l'ausilio del linker? o sempre quando ho ottenuto il codice oggetto? insomma, io scrivo:

#include <stdio.h>

main() {
     
            register int x;

           x = 1;

while(x <= 10){
printf("%d\n", x);
x++;
}
return 0;


come funziona dal punto di vista di classe di memoria? in pratica quando il compilatore traduce il codice scrive direttamente nei registri di cpu l'x...? oppure quando nella fase di caricamento, appena avvio l'eseguibile la x, anzichè essere caricata nella ram, va nei registri cpu?

5 Risposte

  • Re: Vorrei un chiarimento sulle classi di memoria

    Per quel che so io sia register che auto sono due keyword che andrano a perdersi nei meandri del C reference e non + usati. Infatti i compilatori moderni non tengono conto di queste due keyword in quanto sono diventati + intelligenti dei programmatori e sano quando è ora di piazzare una variabile nella memoria del processore. Infatti visual studio ammette l'uso della keyword register ma non ne tiene conto. se è il caso la variabile viene piazzatto nella memoria interna del processore (per caso intendo loop enormi) altrimenti sta nella ram. La decisione non so sinceramente chi lo prende e chi si fa carico.
  • Re: Vorrei un chiarimento sulle classi di memoria

    L'ipotesi che piu accredito, è che il tutto avvenga ovviamente nella fase di caricamento, cioè quando ho il file tradotto, insomma il codice sorgente...dopo di questo punto il compilatore suggerisce ben poco, ma mettiamo sia il compilatore, e che esegua questo trasferimento nella memoria della cpu...durante la traduzione..al primo avvio del programma tutto filerebbe, ma col seguito della chiusura essendo una una keyword comunque automaticca è costretta a cancellarsi...dunque al prossimo riavvio, del programma sarei costretto a ricompilare...altrimenti la register, non funziona piu..o tende ad essere una auto, in quanto le variabili andrebbero prima in ram e poi nella memoria, per tornare nuovamente in ram...secondo me il vantaggio sta qua...ottengo il codice oggetto, nel moomento in cui carico il programma, le variabili vanno direttamente in cpu, cosi come il contenuto...e le funzioni in attesa del dato elaborato, in ram...cosi si ottiene un risparmio di caricamento, cioè le variabili in memoria cpu...si si...oramai ci pensa il compilatore in base alle chiamate..ma era solo per togliermi un dubbio da puntiglioso che sono...grazie sky...
  • Re: Vorrei un chiarimento sulle classi di memoria

    skynet ha scritto:


    per quel che so io sia register che auto sono due keyword che andrano a perdersi nei meandri del C reference e non + usati.
    Vero nel caso di register (addirittura in odor di deprecazione);
    auto invece è stata riciclata nello standard C++0x per le deduzioni automatiche di tipo.
    Ad esempio:
    
    auto var1 = 10; //1 var è un int.
    auto var2 = 20.34 // var2 è un double
    
    std::vector<int> vec;
    auto it = vec.begin(); // it è un iterator di std::vector. 
    
  • Re: Vorrei un chiarimento sulle classi di memoria

    Buono a sapersi, grazie
  • Re: Vorrei un chiarimento sulle classi di memoria

    Discussione interessante e abbastanza condivisa. Quello che posso far notare che 'register' nel classico compilatore C viene utilizzata qualora non esistano opzioni di ottimizzazione del codice. La prova di ciò è visualizzabile debuggando o più semplicemente generando l'output in codice assembler.

    Non credo verrà mai deprecata nel C mentre nel ++ già non viene considerata.

    ~Max
Devi accedere o registrarti per scrivere nel forum
5 risposte