Possono essere memorizzati solo gli interi come variabili di registro?

2

Sono confuso su questo: che tipo di dati possiamo memorizzare nelle variabili di registro? Immagino che logicamente possiamo memorizzare qualsiasi tipo di dati come variabili di registro perché sono variabili, ma in realtà sono confuso.

Ho provato a cercare su internet e nel mio libro. Non sono riuscito a trovare la risposta. Per libro mi riferisco al libro di programmazione di ANSI C.

    
posta Yousaf 03.01.2014 - 19:42
fonte

3 risposte

5

Diamo un'occhiata a ciò che dice lo standard ISO C (farò riferimento all'edizione 2011, una bozza disponibile come N1570 .

6.7.1p6:

A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible. The extent to which such suggestions are effective is implementation-defined.

Si noti che non dice nulla sull'archiviazione dell'oggetto in un registro della CPU.

Altrove, lo standard dice che una dichiarazione esterna non può usare la parola chiave register ; può essere utilizzato solo per le variabili dichiarate all'interno del corpo di una funzione.

Il tentativo di prendere l'indirizzo di un oggetto con qualifica register non è consentito. (Ciò significa che dichiarare un array con register , sebbene sia legale, non è particolarmente utile, devi prendere il suo indirizzo per poter fare l'indicizzazione).

A parte questo, un compilatore è libero di ignorare la parola chiave register , trattandola come equivalente a auto . Puoi applicare la parola chiave register a qualsiasi variabile che ti piace (purché sia definita localmente), indipendentemente dal suo tipo o dimensione - ma l'unica cosa che il compilatore è obbligato a fare è lamentarsi se provi a prendere il suo indirizzo .

Un compilatore è anche libero di memorizzare qualsiasi cosa voglia nei registri della CPU, sia che si usi la parola chiave register o meno, a condizione che il comportamento sia lo stesso di se la variabile fosse stata memorizzata. Ciò include la memorizzazione di una variabile in un registro per tutta la sua durata (se il codice non tenta di calcolare il suo indirizzo), o recuperando il suo valore da un registro in cui il compilatore sa che capita di essere memorizzato invece di ricaricarlo dalla memoria.

La saggezza comune in questi giorni è che i compilatori sono migliori degli umani nel decidere quali variabili devono essere inserite nei registri per una maggiore velocità, quindi la parola chiave register ha un'utilità limitata. Nei vecchi tempi, quando i sistemi erano così piccoli e lenti che i compilatori non potevano permettersi di fare quel tipo di analisi e i dinosauri vagavano per la Terra, register poteva essere molto utile. Con i compilatori moderni, non così tanto.

    
risposta data 04.01.2014 - 01:39
fonte
8

La risposta non è né sì né no. La risposta dipende.

La parola chiave register non ha mai richiesto al compilatore di memorizzare la variabile in un registro. È solo un suggerimento all'ottimizzatore per allocare preferenzialmente un registro per quella variabile.

Con le implementazioni colorazione dei registri dei compilatori moderni è estremamente improbabile che un suggerimento possa migliorare la situazione, ma può facilmente peggiorare la situazione. Oppure l'ottimizzatore lo ignorerà, perché in realtà fa meglio. Pertanto, nel codice moderno, la raccomandazione è dimenticare la parola chiave mai esistita .

Se il compilatore onora effettivamente il suggerimento, dipende comunque dalla presenza o meno di un registro che possa contenere il tipo e se sia disponibile. Tutte le piattaforme dispongono di registri che possono contenere puntatori e registri che possono contenere int . Possono avere o meno dei registri che possono contenere long , long long , double o long double . Il compilatore può anche memorizzare i tipi derivati in uno o più registri se si adattano. Se esiste un registro appropriato, può ancora essere meglio utilizzato da altri valori, probabilmente generati implicitamente dal calcolo preliminare, dall'eliminazione di sub-espressioni e da ottimizzazioni simili. Il compilatore può effettivamente calcolare il costo delle istruzioni che sta per generare e prendere una decisione ben informata sull'allocazione del registro.

E, cosa più importante, non c'è assolutamente alcun modo per dirlo quando scrivi il codice in cui il suggerimento potrebbe essere utile. L'unico modo per sapere è profilare il codice. Quindi non preoccuparti della parola chiave register prima di aver eseguito il debug del tuo codice, ottimizzato tutti gli algoritmi ed eliminato qualsiasi lavoro non necessario. Non dimenticare, l'ottimizzazione prematura è la radice di tutti i mali e register è solo l'ottimizzazione dell'ultima risorsa.

    
risposta data 03.01.2014 - 20:10
fonte
2

La parola chiave register in C può essere utilizzata su qualsiasi tipo di variabile (locale) ed è solo un suggerimento per il compilatore che userete spesso quella variabile, quindi il compilatore dovrebbe fare l'accesso il più velocemente possibile. Poiché mantenere una variabile in un registro del processore è spesso il modo più rapido per accedervi di nuovo, questo è il nome scelto per questo suggerimento.

I compilatori C moderni (meno di 20 anni) sono abbastanza bravi a determinare quali variabili tenere nei registri che non hanno bisogno di suggerimenti come la parola chiave register , e talvolta causano anche un rallentamento (quando il compilatore onora il suggerimento e produce codice sub-ottimale come risultato).

Quali tipi di valori è possibile memorizzare nei registri fisici di un processore dipende dall'architettura del processore, ma in genere è limitato a valori di tipo intero (compresi i puntatori) e valori in virgola mobile.

    
risposta data 03.01.2014 - 20:15
fonte

Leggi altre domande sui tag