Newsgroup: it.comp.lang.c
Titolo: register

Ciao a tutti,
lo standard dice che ogni parametro formale di una funzione ha un automatic
storage duration, ma allora che serve esplicitare register in una
dichiarazione o in una definizione di funzione?

 Ciao a tutti,

Lo specificatore register serve ad indicare al compilatore di mantenere
in un registro (sempre che sia possibile) la variabile a cui fa
riferimento.
E' "un invito", non un obbligo: il compilatore puo' ignorare completamente
lo specificatore e mantenere nei registri altre variabili.
Con i compilatori moderni l'uso di register e' abbastanza inutile.
In ogni caso questo specificatore va messo solo se si sa cosa si sta
facendo.
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 facendo.
Ovvero quasi mai ;)
--------------------------------
Inviato via 
http://usenet.libero.it

Innanzitutto grazie per le risposte, ma mi rimane un'interrogativo.
Ragionando per assurdo ho un codice simile a:
int funzione(register int a);
int funzione(int a);
/* secondo lo standard (C9x) l'utilizzo di register nella dichiarazione di
un parametro formale all'interno di una function declaration viene ignorato
*/
void altra_funzione(void)
     {
      funzione(10);
     }
int funzione(register int a)
    {
     /* un certo codice */
    }
In questo caso l'utilizzo di register indicherebbe che la funzione
"teoricamente" si aspetta il passaggio dell'argomento corrispodente ad "a"
in un registro - correggetemi se sbaglio -. Ma il chiamente, che conosce
solamente il comportamento di facciata della funzione definito dal suo
valore di ritorno e dal suo prototipo (che non include l'utilizzo di
register), come potrebbe decidere di passare il valore in un registro?
Inoltre nel punto 9 dello standard C9x -scusate se i riferimenti sono
incompleti - indica che ogni parametro formale ha un automatic storage
duration definito dall'implementazione.
Ed è proprio questo il mio interrogativo: il concetto di register non entra
in contrasto con il suddetto punto?
Grazie.
"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:80Z105Z34Z80Y1...@usenet.libero.it...


 entra in contrasto con il suddetto punto?
Certo che no: la 'duration' implicata da 'register' e` esattamente la
stessa di quella implicata da 'auto', sia per i parametri sia per qualsiasi
altra variabile locale di una funzione.
Alex

Ringrazio tutti per le risposte.

 dichiarazione o in una definizione di funzione?
/register/  ed  /auto/ sono  molto  diversi. Allo  storage class  /auto/
appartengono tutte le variabili non  globali dichiarate nel programma, a
meno che non venga indicato diversamente.
Scrivere:
int a;
oppure:
auto int a;
e` la  stessa cosa (purche`  la variabile non sia  globale). /register/,
invece,  indica  la  compilatore  di piazzare  quella  variabile  in  un
registro del processore. Questo, pero`, e`  solo un hint: il compilatore
deve prima verificare  se la variabile possa stare in  un registro e poi
verificare  se  ha  abbastanza registri  liberi. Anche  prescindendo  da
queste considerazioni  il compilatore  puo` liberamente  ignorare questa
indicazione. Nota  che,  anche  nel  caso il  compilatore  decidesse  di
ignorare /register/,  rimane *illegale* cercare di  prendere l'indirizzo
di una variabile dichiarata /register/.
register int a;
int *p;
p = &a;         /* SBAGLIATO!! */
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La mia teoria scientifica preferita e` quella secondo la quale gli 
 anelli di Saturno sarebbero interamente composti dai bagagli andati 
 persi nei viaggi aerei." -- Mark Russel